; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 141 SLOE Jan ***, 1859 00:00:03 file DSK:CFNEW.SLO -- of -- f2x 39m0155 39m0155 39m0155 ;------------------------------------------------------------------------------ 39m0155 ; 39m0155 ; FooVision 39m0155 ; 39m0155 ;------------------------------------------------------------------------------ 39m0155 .REPEAT VID [ 39m0155 .INSERT VID.SLO 39m0155 ];[ 39m0155 .INSERT VID.SLO ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 142 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 01m0001 COMMENT \ VID.SLO 01m0001 01m0001 This is the microcode for vector display i/o. 01m0001 There are two basic macro instructions: 01m0001 VIDIN AC,E: 770000,,0 01m0001 input from VID with i/o sub sel = ac 01m0001 to contents of effective address. 01m0001 VIDOUT AC,E: 771000,,0 01m0001 output from contents of effective address 01m0001 to VID with i/o sub sel = ac 01m0001 01m0001 These get dispatched to by 700 series iots 01m0001 (although the format is more like a non-iot instruction.) 01m0001 01m0001 ;OPDEF's for FooVision: 01m0001 OPDEF VIDIN [770000,,0] ;In to CPU from FooVision (AC=MAPF) 01m0001 OPDEF VIDOUT [771000,,0] ;Out from CPU to FooVision (AC=MAPF) 01m0001 OPDEF VLDDAT [VIDOUT 1,] ;36 bit format or B,G,R 8 bits each 01m0001 OPDEF VSYDAT [VIDIN 1,] ;Synthesize DATA (also to (E)) 01m0001 OPDEF VLDADR [VIDOUT 2,] ;16 bits right justified 01m0001 OPDEF VSYADR [VIDIN 2,] ;Synthesize ADR (also to (E)) 01m0001 OPDEF VLDBAK [VIDOUT 3,] ;IOB 4-11 (of 36 bit word, 0=MSB) 01m0001 OPDEF VOEVID [VIDIN 4,] ;36 bit format palette(3),(11*PIXEL(3)) 01m0001 OPDEF VOECOL [VIDIN 5,] ;B,G,R 8 bits each right justified 01m0001 OPDEF VWECOL [VIDIN 6,] ;Write enable color map - (E) trashed 01m0001 OPDEF VWEVID [VIDIN 7,] ;Write enable video buffer - (E) trashed 01m0001 OPDEF VLDCOL [VIDOUT 10,] ;36 bit mask XORed with synthesized data 01m0001 OPDEF VLDSIZ [VIDOUT 11,] ;OFFSET,,SIZE (in WDS/FLD (11 PXLS/WD)) 01m0001 OPDEF VLDCTR [VIDOUT 12,] ;B0=video resolution (vs. high res B/W) 01m0001 ;B1=add (don't overwrite) 01m0001 ;B2=carry 01m0001 ;B3=interlace 01m0001 ;B4=NTSC color 01m0001 OPDEF VLDPIX [VIDOUT 13,] ;Inten.(3 bit),line (9 bit),,pixel(10 bit) 01m0001 OPDEF VLDOFF [VIDOUT 14,] ;Y offset,,X offset 01m0001 OPDEF VWEDIV [VIDIN 16,] ;Write enable divide table - (E) trashed 01m0001 OPDEF VWENTS [VIDIN 17,] ;Write enable NTSC table - (E) trashed 01m0001 01m0001 There are three additional instructions which simulate part of the 01m0001 Stanford-III vector display: 01m0001 01m0001 OPDEF DPYINI [772000,,0] ;Initialize display 01m0001 OPDEF DPYOUT [773000,,0] ;Interpret Stanford-III display format 01m0001 OPDEF DPYADD [767000,,0] ;Append Stanford-III display format 01m0001 01m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 143 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 02m0001 DPYINI POGB ;Take a block of 64 words at E (which contain 02m0001 ;pointers to "shadow" pieces-of-glass, fonts, 02m0001 ;and various other state (used in interrupts)). 02m0001 ;Zero all POG lengths, and blank screen. 02m0001 02m0001 POGB: 02m0001 POGB+1: 02m0001 ... 02m0001 POGB+15: 02m0001 ;These are pointers to blocks of memory where 02m0001 ;the display list for the previous piece of 02m0001 ;glass is copied. This data is subtracted 02m0001 ;from the image by DPYOUT before adding the 02m0001 ;new display list. 02m0001 02m0001 POGB+16: ;Window boundaries 02m0001 POGB+17: 02m0001 ... 02m0001 POGB+31: 02m0001 02m0001 POGB+32: ;Note: These are internal (- at top) coords. 02m0001 POGB+33: 02m0001 ... 02m0001 POGB+47: 02m0001 02m0001 POGB+48: ;Pointers to fonts (2K each) 02m0001 POGB+49: 02m0001 POGB+50: 02m0001 ... 02m0001 POGB+55: 02m0001 02m0001 POGB+56: ;State for interrupt recovery 02m0001 POGB+57: 02m0001 POGB+58: 02m0001 POGB+59: ;Non VIC2 only 02m0001 POGB+60:;Non VIC2 only 02m0001 POGB+61: 02m0001 POGB+62: 02m0001 POGB+63: 02m0001 02m0001 POGB+64: 02m0001 POGB+65: 02m0001 ... 02m0001 POGB+71: 02m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 144 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 03m0001 DPYOUT POG,E ;Similar to the stanford instruction. Takes 03m0001 (DPYADD) ;a pointer and length for the display list 03m0001 ;for the piece of glass and puts it on the 03m0001 ;screen, deleting (or adding to) the previous 03m0001 ;contents of that piece of glass. 03m0001 03m0001 E: ,, 03m0001 03m0001 Below are the two objects (vectors and characters) implemented from 03m0001 the Stanford-III display system: 03m0001 03m0001 Long Word Vector: 03m0001 !00 10!11 21!22 24!25 27!28!29!30 31!32 35! 03m0001 ! X ! Y ! BRT ! SIZE ! !M ! T ! 0110 ! 03m0001 BRT(color): SIZE: M: T: 03m0001 0=no change 0=no change 0=relative 0=visible 03m0001 1=white 1=font 1 1=absolute 1=end point 03m0001 2=red . 2=invisible 03m0001 3=yellow . 3=undefined 03m0001 4=green . (end point) 03m0001 5=blue . 03m0001 6=magenta . 03m0001 7=white(colored) 7=font 7 03m0001 03m0001 CHaRacter: 03m0001 !00 06!07 13!14 20!21 27!28 34!35! 03m0001 ! CH1 ! CH2 ! CH3 ! CH4 ! CH5 !1 ! 03m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 145 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 04m0001 Vector algorithms: 04m0001 X(Y)=X(Y-1)+DXDY 04m0001 INTEN(Y,INT(X(Y)))= 3*(1-FRACT(X)) if A3DYDX GEQ 3 04m0001 3-A3DYDX*FRACT(X) if A3DYDX < 3 04m0001 INTEN(Y,INT(X(Y))+1)= 3*FRACT(X) if A3DYDX GEQ 3 04m0001 3-A3DYDX*(1-FRACT(X)) if A3DYDX < 3 04m0001 INTEN(Y,INT(X(Y))-K)=INTEN(Y,INT(X(Y))-(K-1))-A3DYDX 04m0001 INTEN(Y,INT(X(Y))+K)=INTEN(Y,INT(X(Y))+(K-1))-A3DYDX 04m0001 where: 04m0001 FRACT(X) =fractional part of X 04m0001 INT(X) =integer part of X 04m0001 X(Y) =X(growing left to right) position as a function of 04m0001 Y(growing top to bottom) 04m0001 INTEN(Y,X) =intensity as a function of position 04m0001 DXDY =slope of X vs. Y 04m0001 A3DYDX =three times the absolute value of the slope of Y vs. X 04m0001 04m0001 The compromise color/grey level coding is as follows: 04m0001 04m0001 per word: 0 1 2 3 4 5 6 7 04m0001 per pixel: 04m0001 0 sync black black black black black black black 04m0001 1 sync W 1 W 1 W 1 W 1 W 1 W 1 W 1 04m0001 2 sync W 2 W 2 W 2 W 2 W 2 W 2 W 2 04m0001 3 sync W 3 W 3 W 3 W 3 W 3 W 3 W 3 04m0001 4 sync W 4 R 3 Y 3 G 3 B 3 M 3 W 4 04m0001 5 sync W 5 R 3 Y 3 G 3 B 3 M 3 W 5 04m0001 6 sync W 6 R 3 Y 3 G 3 B 3 M 3 W 6 04m0001 7 sync W 7 R 3 Y 3 G 3 B 3 M 3 W 7 04m0001 04m0001 B/W objects are clipped to intensity level 3. Colored objects are always 04m0001 either intensity 0 (blank) or intensity 4. This will make the overlapping 04m0001 of a colored object over one B/W object always come out colored and of the 04m0001 correct intensity. 04m0001 04m0001 Note that two overlapping colored objects will cancel. Also note that a 04m0001 colored object overlapping two B/W objects which already overlap will not 04m0001 come out correctly colored. Finally, it is still only possible to have 04m0001 one color per word, i.e. two differently colored objects in the same word 04m0001 will overwrite eachother. 04m0001 04m0001 04m0001 This code will take interrupts correctly, but not map faults, since it is 04m0001 in general impossible to save all ones state so that one can restart. 04m0001 Specifically, there is no provision currently for saving the micro PC 04m0001 from which you faulted. 04m0001 04m0001 To get around this failing, it is necessary to "touch" (i.e., reference) 04m0001 each page that the display list might require. This has an unplesant 04m0001 interaction with the scheduler in Tenex, which will frequently not allow 04m0001 the page touching loop to terminate (it has to get all the pages mapped 04m0001 before it can let the code run). To get around this, the code turns off the 04m0001 real time clock before touching and turns it back on after touching so that 04m0001 the code can interrupt as usual. This prevents scheduling due to interrupts 04m0001 from the real time clock during page validation cycles (map operations 04m0001 where the physical memory is actually there, but the map is invalid, usually 04m0001 due to map CONOs.) ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 146 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 04m0001 \ 04m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 147 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 05m0001 ;Note that VIDTAB (the dispatch table) must appear before VIDIN 05m0001 ;and VIDOUT due to forward referencing problems. 05m0001 05m0001 0 %VIDFOO = 0 05m0001 05m0001 VIDTAB: ;dispatch table used by both VIDIN and VIDOUT. 05m0001 .REPEAT 16. 05m0001 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06226 240144430571000440000000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 1 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06227 240144430571000440010000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 2 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06230 240144430571000440020000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 3 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06231 240144430571000440030000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 4 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06232 240144430571000440040000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 5 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06233 240144430571000440050000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 6 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06234 240144430571000440060000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 7 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06235 240144430571000440070000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 10 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06236 240144430571000440100000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 11 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06237 240144430571000440110000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 12 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06240 240144430571000440120000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 13 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06241 240144430571000440130000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 14 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06242 240144430571000440140000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 15 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06243 240144430571000440150000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 16 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06244 240144430571000440160000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 17 %VIDFOO = %VIDFOO + 1 05m0001 ] 05m0001 06245 240144430571000440170000 [ MAPF[%VIDFOO] D[IOD] DEST[HOLD] JUMP[VIDCOM] C800$ 05m0001 20 %VIDFOO = %VIDFOO + 1 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 148 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 05m0001 ] ;i/o sub sel = ac. input data and hold for memory write. 05m0001 05m0001 06246 640700014171014620000000 VIDIN: D[CONST (VIDTAB / 100)] ROT[6] DEST[Q] NORM$ 05m0001 ;form high order 6 bits of table dispatch. 05m0001 06247 640700014175000260000000 D[CONST (VIDTAB \ 100)] ALU[DORQ] DEST[Q] NORM$ 05m0001 ;or in low order 6 bits of table dispatch. 05m0001 06250 440540034435032043400000 D[IR] ROT[13.] MASK[4] ALU[D+Q] SDISP START-IN C600$ 05m0001 ;add ac field and dispatch. start input. 05m0001 05m0001 06251 640702204571000440000000 VIDOUT: D[MEM] DEST[IOD] NORM$ 05m0001 ;put contents effective address into iod output register. 05m0001 06252 640700014171014620000000 D[CONST (VIDTAB / 100)] ROT[6] DEST[Q] NORM$ 05m0001 ;form high order 6 bits of table dispatch. 05m0001 06253 640700014175000260000000 D[CONST (VIDTAB \ 100)] ALU[DORQ] DEST[Q] NORM$ 05m0001 ;or in low order 6 bits of table dispatch. 05m0001 06254 440540034435032043600000 D[IR] ROT[13.] MASK[4] ALU[D+Q] SDISP START-OUT C600$ 05m0001 ;add ac field and dispatch. start output. 05m0001 05m0001 VIDCOM: ;common completion. 05m0001 06255 451140034571020440002026 D[IR] ROT[8] COND[OBUS<0] JUMP[MAIN] C600$ 05m0001 ;if VIDOUT, done. jump main. 05m0001 06256 662104000571000440002032 STRT-WRT MEMST$ [COND[-MA-AC] LBJUMP[MSMAIN] NORM ] 05m0001 ;if VIDIN, write as in movem. 05m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 149 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 06m0001 ;Main A-MEM: 06m0001 1 INTEN,,FRACT = 1 ;For storage of vector display word 06m0001 7 POG,,POGB = 7 ;Left by DPYINI 06m0001 06m0001 .REPEAT XUCODE [ 06m0001 .USE[HIGHMEM] ;If 8K u-mem present, put video code there. 06m0001 ] 06m0001 [ 06m0001 .USE[HIGHMEM] [ XLIST 06m0001 LIST ];If 8K u-mem present, put video code there. 06m0001 ] 06m0001 ;This macro saves the address given as its argument so that returns 06m0001 ;from interrupts can resume operation there. Jumps to VIDINT, which 06m0001 ;saves AMEM, then goes to MAIN. 06m0001 06m0001 ;WARNING! WARNING !WARNING 06m0001 ;THIS PIECE-OF-SHIT ASSEMBLER WON'T ACCEPT COMPOUND MACRO ARGUMENTS. 06m0001 ;I.E., YOU MUST EVALUATE ARGUMENTS BEFORE INVOKING A MACRO. 06m0001 06m0001 ;ALSO, IF YOU CHANGE THE LENGTH OF THIS MACRO, REMEMBER TO ALTER THE 06m0001 ;JUMP[. + 9]'S IN VIDRGT AND VIDLFT. 06m0001 06m0001 .DEFINE VIDSAV[%ADR] 06m0001 [ D[CONST (%ADR / 10000)] ROT[12.] DEST[Q] NORM $ 06m0001 ;Q=high bit (SDISP loads all 16 bits) 06m0001 D[CONST (77 & (%ADR / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 06m0001 ;Q=next 6 ADR bits 06m0001 D[CONST (%ADR \ 100)] ALU[QORD] DEST[HOLD] NORM $ 06m0001 ;Q=SAVE ADR 06m0001 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 06m0001 ;Q=POGB 06m0001 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 06m0001 ;MA=POGB+58 write SAVE ADR 06m0001 ] 06m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 150 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 07m0001 ;DPYINI 07m0001 ;Save the POG block pointer for use by DPYOUT. 07m0001 10353 640701614571000040000000 VIDDPI: D[CONST 4] DEST[DEV-ADR] NORM $ 07m0001 ;DEV-ADR=INTERRUPT 07m0001 10354 640702214571000003600000 D[CONST 0] DEST[IOD] START-OUT NORM $ 07m0001 ;TURN OFF INTERRUPTS (SO WE DON'T GO TO THE SCHEDULER) 07m0001 10355 240700000571000440060000 MAPF[6] C800 $ 07m0001 ;BIT 35 = ON/OFF 07m0001 10356 640701614571000360000000 D[CONST 36] DEST[DEV-ADR] NORM $ 07m0001 ;DEV-ADR=36 07m0001 10357 640701634571000223000000 D[IR] MASK[18.] DEST[POG,,POGB] DEST-A-MEM NORM $ 07m0001 ;POG,,POGB=0,,E 07m0001 07m0001 ;Zero all lengths. 07m0001 10360 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 07m0001 ;Q=POGB. 07m0001 10361 640704400615000440000000 ALU[0] DEST[HOLD] NORM $ 07m0001 ;HOLD=0 07m0001 10362 640724014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 07m0001 ;MA=POGB+56. write (0) 07m0001 10363 640746214571000170020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-WRT] D[CONST 15.] LLOAD NORM $ 07m0001 ;Touch Loop 16 times 07m0001 10364 640720000555000440000000 VIDIN1: ALU[Q] DEST[MA] NORM $ 07m0001 ;MA=Q read 07m0001 10365 640706000017000440020000 MAPF[NORM-RD] ALU[Q+1] DEST[Q FIXMAC-MAPF-RD] CYLEN[FIXM] $ 07m0001 ;Q=Q+1 touch 07m0001 10366 640710004571006250000000 D[MEM] ROT[3] MASK[21.] DEST[AR] NORM $ 07m0001 ;AR=BACKGROUND,LENGTH,,BEGINING LSH 3 MASK 21 (LENGTH=0) 07m0001 10367 640704200571102440000000 D[AR] ROT[36. - 3] DEST[MEMSTO] NORM $ 07m0001 ;HOLD=BACKGROUND,0,,BEGINING write 07m0001 07m0001 ;Initialize the remaining length counter for this piece of glass. 07m0001 10370 640710004531000220000000 D[MEM] MASK[18.] ALU[D-1] DEST[AR] NORM $ 07m0001 ;AR=BEGINING POG-1 07m0001 10371 640720000531000440000000 D[AR] ALU[D-1] DEST[MA] NORM $ 07m0001 ;MA=BEGINING -2 read max length 07m0001 10372 640700000571000440020000 MAPF[NORM-RD] NORM $ 07m0001 ;WAIT 07m0001 10373 640704404571000440000000 D[MEM] DEST[HOLD] NORM $ 07m0001 ;HOLD=MAX LENGTH Sigh. HOLD and MEM really are different 07m0001 10374 640724000571000440000000 D[AR] DEST[MA] STRT-WRT NORM $ 07m0001 ;MA=BEGINING-1 write remaining length 07m0001 10375 640246200571000440020364 MAPF[NORM-RD] DEST[FIXMAC-MAPF-WRT] LOOP[VIDIN1] CYLEN[FIXM] $ 07m0001 ;touch and loop 07m0001 07m0001 ;Turn interrupts back on. 07m0001 10376 640701614571000040000000 D[CONST 4] DEST[DEV-ADR] NORM $ 07m0001 ;DEV-ADR=INTERRUPT 07m0001 10377 640702214571000013600000 D[CONST 1] DEST[IOD] START-OUT NORM $ 07m0001 ;TURN ON INTERRUPTS 07m0001 10400 240700000571000440060000 MAPF[6] C800 $ 07m0001 ;BIT 35 = ON/OFF 07m0001 10401 640701614571000360000000 D[CONST 36] DEST[DEV-ADR] NORM $ 07m0001 ;DEV-ADR=36 07m0001 07m0001 ;Clear screen. 07m0001 D[CONST 44] ROT[30.] DEST[IOD] START-OUT ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 151 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 07m0001 10402 656142214571074443600000 COND[HALF] JUMP[VIDNTR] NORM $ 07m0001 ;IOD=440000,,000000 Check HALF 07m0001 10403 240700014171014070120000 VIDHER: MAPF[12] D[CONST 7] ROT[6] DEST[Q] C800 $ 07m0001 ;VLDCTR (overwrite) Q=7*64 (past vert. sync) 07m0001 10404 640710014571006360000000 D[CONST 30.] ROT[3] DEST[AR] NORM $ 07m0001 ;AR=240. (major loops) 07m0001 10405 640740014571000710000000 VIDIN2: D[CONST 57.] LLOAD NORM $ 07m0001 ;Loop 58. times 07m0001 10406 640700014035000060000000 D[CONST 6] ALU[Q+D] DEST[Q] NORM $ 07m0001 ;Q=Q+6 (past horiz. sync) 07m0001 10407 240702200555000443600000 VIDIN3: ALU[Q] DEST[IOD] START-OUT C800 $ 07m0001 ;IOD=Q 07m0001 10410 240700000571000440020000 MAPF[2] C800 $ 07m0001 ;VLDADR 07m0001 10411 240702214571102073600000 D[CONST 7] ROT[33.] DEST[IOD] START-OUT C800 $ 07m0001 ;IOD=700000,,000000 07m0001 10412 240700000571000443410000 MAPF[1] START-IN C800 $ 07m0001 ;VLDDAT (blank) 07m0001 10413 240700000571000440070000 MAPF[7] C800 $ 07m0001 ;VWEVID 07m0001 10414 240700000571000440000000 C800 $ 07m0001 ;WAIT 07m0001 10415 240702214435034013600000 D[CONST 1] ROT[14.] ALU[Q+D] DEST[IOD] START-OUT C800 $ 07m0001 ;IOD=Q+1 FIELD 07m0001 10416 240700000571000440020000 MAPF[2] C800 $ 07m0001 ;VLDADR 07m0001 10417 240702214571102073600000 D[CONST 7] ROT[33.] DEST[IOD] START-OUT C800 $ 07m0001 ;IOD=700000,,000000 07m0001 10420 240700000571000443410000 MAPF[1] START-IN C800 $ 07m0001 ;VLDDAT (blank) 07m0001 MAPF[7] ALU[Q+1] DEST[Q] 07m0001 10421 241140000017000440070000 COND[INTRPT] JUMP[VIDNTI] C800 $ 07m0001 ;VWEVID Q=Q+1 If interrupt, save state 07m0001 10422 240240000571000440000407 VIDIN4: LOOP[VIDIN3] C800 $ 07m0001 ;loop 07m0001 D[AR] ALU[D-1] DEST[AR] 07m0001 10423 470150000531000440000405 COND[-OBUS=0] JUMP[VIDIN2] C600 $ 07m0001 ;AR=AR-1 if 0, done. 07m0001 07m0001 ;Done. 07m0001 10424 640141600615000442200350 ALU[0] DEST[DEV-ADR] SPEC[CLR-HALF] JUMP[GOMAIN] NORM $ 07m0001 ;Reset device address, clear HALF 07m0001 07m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 152 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 08m0001 ;Interrupt init 08m0001 10425 640704400555000440000000 VIDNTI: ALU[Q] DEST[HOLD] NORM $ 08m0001 ;HOLD=Q 08m0001 10426 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 08m0001 ;Q=POGB 08m0001 10427 640724014435014010000000 D[CONST 1] ROT[6] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 08m0001 ;MA=POGB+64. write old Q 08m0001 10430 640706200571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-WRT] CYLEN[FIXM] $ 08m0001 ;TOUCH 08m0001 10431 640704400571000440000000 D[AR] DEST[HOLD] NORM $ 08m0001 ;HOLD=AR 08m0001 10432 640724014437014010000000 D[CONST 1] ROT[6] ALU[D+Q+1] DEST[MA] STRT-WRT NORM $ 08m0001 ;MA=POGB+65. write old AR 08m0001 10433 640706200571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-WRT] CYLEN[FIXM] $ 08m0001 ;TOUCH 08m0001 10434 640700014171076010000000 D[CONST 1] ROT[35. - 4] DEST[Q] NORM $ 08m0001 ;Q=BIT 4 ON 08m0001 10435 640704620531000440000000 D[PC] ALU[D-1] DEST[PC] NORM $ 08m0001 ;PC=PC-1 08m0001 10436 640705420575000440000000 D[PC] ALU[DORQ] DEST[CRYOV] NORM $ 08m0001 ;Set HALF flag 08m0001 10437 640141600615000440000350 ALU[0] DEST[DEV-ADR] JUMP[GOMAIN] NORM $ 08m0001 ;Reset dev and disp to intrpt 08m0001 08m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 153 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 09m0001 ;Return from init interupt. 09m0001 10440 240700074171000220120000 VIDNTR: MAPF[12] D[10 + POG,,POGB] MASK[18.] DEST[Q] C800 $ 09m0001 ;VLDCTR Q=POGB 09m0001 10441 640720014437014010000000 D[CONST 1] ROT[6] ALU[D+Q+1] DEST[MA] NORM $ 09m0001 ;MA=POGB+65. read old AR 09m0001 MAPF[NORM-RD] D[CONST 30.] ROT[3] DEST[Q FIXMAC-MAPF-RD] 09m0001 10442 640706014171006360020000 CYLEN[FIXM] $ 09m0001 ;TOUCH Q=240. 09m0001 D[MEM] MASK[18.] ALU[Q-D] 09m0001 10443 451140004477000220000403 COND[OBUS<0] JUMP[VIDHER] C600 $ 09m0001 ;Check for half word error (i.e. HALF left from another inst) 09m0001 10444 640710004571000220000000 D[MEM] MASK[18.] DEST[AR] NORM $ 09m0001 ;Restore AR 09m0001 10445 240700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] C800 $ 09m0001 ;Q=POGB 09m0001 10446 640720014435014010000000 D[CONST 1] ROT[6] ALU[Q+D] DEST[MA] NORM $ 09m0001 ;MA=POGB+64. read old Q 09m0001 10447 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 09m0001 ;TOUCH 09m0001 D[MEM] MASK[6] DEST[Q] 09m0001 10450 530140004171000060000000 COND[-OBUS=0] JUMP[VIDNR1] C550 $ 09m0001 ;Old Q mod 6. 09m0001 10451 640700014171014010000000 D[CONST 1] ROT[6] DEST[Q] NORM $ 09m0001 ;If Q=0, Q=64. 09m0001 10452 640740014537014010000000 VIDNR1: D[CONST 1] ROT[6] ALU[D-Q] LLOAD NORM $ 09m0001 ;Count=remaining till end of line 09m0001 10453 640140004171000440000422 D[MEM] DEST[Q] JUMP[VIDIN4] NORM $ 09m0001 ;Restore Q and resume from interrupt 09m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 154 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;DPYOUT (DPYADD) main loop 10m0001 10454 640700014171076010000000 VIDDPA: D[CONST 1] ROT[35. - 4] DEST[Q] NORM $ 10m0001 ;Q=BIT 4 ON 10m0001 10455 640705420575000440000000 D[PC] ALU[DORQ] DEST[CRYOV] NORM $ 10m0001 ;SET HALF FLAG 10m0001 10m0001 ;FooVision device address (also AMEM block) 10m0001 10456 640701614571000040000000 VIDDPO: D[CONST 4] DEST[DEV-ADR] NORM $ 10m0001 ;DEV-ADR=INTERRUPT 10m0001 10457 640702214571000003600000 D[CONST 0] DEST[IOD] START-OUT NORM $ 10m0001 ;TURN OFF INTERRUPTS (SO WE DON'T GO TO THE SCHEDULER) 10m0001 10460 240700000571000440060000 MAPF[6] C800 $ 10m0001 ;BIT 35 = ON/OFF 10m0001 10461 640701614571000360000000 D[CONST 36] DEST[DEV-ADR] NORM $ 10m0001 ;DEV-ADR=36 10m0001 10m0001 ;Save AC=POG in AMEM 10m0001 10462 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10463 640710034571032040000000 D[IR] ROT[13.] MASK[4] DEST[AR] NORM $ 10m0001 ;AR=POG=AC 10m0001 10464 640701600575044443000000 D[AR] ROT[18.] ALU[DORQ] DEST[POG,,POGB] DEST-A-MEM NORM $ 10m0001 ;POG,,POGB=AC,,POGB 10m0001 10m0001 ;"Touch" the first and last words of the POG block, so we don't 10m0001 ;have to worry about map faulting on them later. 10m0001 10465 640720074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q MA] NORM $ 10m0001 ;Q,MA=POGB 10m0001 10466 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH FIRST WORD 10m0001 10467 640710014531006110000000 D[CONST 11] ROT[3] ALU[D-1] DEST[AR] NORM $ 10m0001 ;AR=71. 10m0001 10470 640720000435000440000000 D[AR] ALU[D+Q] DEST[MA] NORM $ 10m0001 ;MA=POGB+71. 10m0001 10471 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH LAST WORD 10m0001 10m0001 ;Touch E. If left half E (=length of display list)=0, don't bother to 10m0001 ;touch display list. 10m0001 10472 640720034571000220000000 D[IR] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=E 10m0001 10473 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH 10m0001 10474 640710004571000220000000 D[MEM] MASK[18.] DEST[AR] NORM $ 10m0001 ;AR=BEGINING 10m0001 10475 510140004571000000200000 D[MEM] SPEC[LEFT] COND[OBUS=0] JUMP[VIDTDE] C550 $ 10m0001 ;If LENGTH=0, don't touch (but do continue) 10m0001 10m0001 ;Touch the display list. Start with the first word, touch every 10m0001 ;512.th word until run off end. Then touch last word. 10m0001 10476 640720000171000440000000 VIDTDL: D[AR] DEST[Q MA] NORM $ 10m0001 ;Q,MA=AR (initially begining of display list) 10m0001 MAPF[NORM-RD] D[CONST 1] ROT[9.] ALU[Q+D] 10m0001 10477 640716014035022010020000 DEST[AR Q FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;AR,Q=AR+1 PAGE touch (post inc) 10m0001 10500 640720034571000220000000 D[IR] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=E ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 155 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 10501 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;WAIT 10m0001 10502 640700004077000220000000 D[MEM] MASK[18.] ALU[Q-D] DEST[Q] NORM $ 10m0001 ;Q=AR-BEGINING 10m0001 D[MEM] ROT[18.] MASK[18.] ALU[D-Q-1] DEST[Q] 10m0001 10503 471140004135044220000476 COND[-OBUS<0] JUMP[VIDTDL] C600 $ 10m0001 ;Q=LENGTH-(AR-BEGINING)-1 if<0 done 10m0001 10504 640720000435000440000000 D[AR] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=BEGINING+LENGTH-1 10m0001 10505 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH LAST PAGE 10m0001 10m0001 ;Touch the POG buffer for this POG. Same as for display list. 10m0001 ;(POGn-2)=POG maximum length 10m0001 ;(POGn-1)=POG words left 10m0001 10506 640700074171000220000000 VIDTDE: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10507 640720074435044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+POG read begining pog buffer 10m0001 10510 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;wait 10m0001 10511 640710004171000220000000 D[MEM] MASK[18.] DEST[Q AR] NORM $ 10m0001 ;AR,Q=0,,BEGINING POG BUFFER 10m0001 10512 640720014477000020000000 D[CONST 2] ALU[Q-D] DEST[MA] NORM $ 10m0001 ;MA=POGN-2 read maximum length 10m0001 10513 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH -2nd word 10m0001 10514 640710004575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[AR] NORM $ 10m0001 ;AR=MAXIMUM LENGTH,,BEGINING POG 10m0001 10515 640700200571000443000000 D[AR] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 10m0001 ;INTEN,,FRACT=MAXIMUM LENGTH,,BEGINING POG 10m0001 10516 640720000171000440000000 VIDTNL: D[AR] DEST[Q MA] NORM $ 10m0001 ;Q,MA=AR 10m0001 MAPF[NORM-RD] D[CONST 1] ROT[9.] ALU[Q+D] 10m0001 10517 640706014035022010020000 DEST[Q FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;AR,Q=AR+1 PAGE touch (post inc) 10m0001 10520 640710014477066010000000 D[CONST 1] ROT[18. + 9.] ALU[Q-D] DEST[AR] NORM $ 10m0001 ;AR=AR+(-1000,,1000) 10m0001 10521 640700000171000000200000 D[AR] SPEC[LEFT] DEST[Q] NORM $ 10m0001 ;Q=REMAINING LENGTH,,0 10m0001 D[CONST 1] ROT[18.] ALU[Q-D] 10m0001 10522 471140014477044010000516 COND[-OBUS<0] JUMP[VIDTNL] C600 $ 10m0001 ;If LENGTH LEQ 0, done 10m0001 10523 640700044131044170000000 D[10 + INTEN,,FRACT] ROT[18.] MASK[15.] ALU[D-1] DEST[Q] NORM $ 10m0001 ;Q=LENGTH-1 10m0001 10524 640720044435000220000000 D[10 + INTEN,,FRACT] MASK[18.] ALU[D+Q] DEST[MA] NORM $ 10m0001 ;MA=BEGINING+LENGTH-1 10m0001 10525 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH LAST WORD 10m0001 10m0001 ;Touch all 7 fonts. Same as above. 10m0001 VIDTNE: 10m0001 10526 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10527 640710014435000600000000 D[CONST 48.] ALU[Q+D] DEST[AR] NORM $ 10m0001 ;AR=POGB+48 10m0001 10530 640740014571000060000000 D[CONST 6] LLOAD NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 156 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;LOOP 7 TIMES 10m0001 10531 640730000433000440000000 VIDTFL: D[AR] ALU[D+1] DEST[MA AR] NORM $ 10m0001 ;MA,AR=AR+1 10m0001 10532 640700000571000440000000 NORM $ 10m0001 ;WAIT 10m0001 10533 640720004171000220000000 D[MEM] MASK[18.] DEST[MA Q] NORM $ 10m0001 ;MA,Q=FONT 1 10m0001 10534 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE 10m0001 .REPEAT 3 10m0001 [ D[CONST 1] ROT[9.] ALU[Q+D] DEST[MA Q] NORM $ 10m0001 ;MA,Q=Q+1 PAGE 10m0001 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE 10m0001 ] 10m0001 10m0001 10535 640720014035022010000000 [ D[CONST 1] ROT[9.] ALU[Q+D] DEST[MA Q] NORM $ 10m0001 ;MA,Q=Q+1 PAGE 10m0001 10536 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE 10m0001 ] 10m0001 10537 640720014035022010000000 [ D[CONST 1] ROT[9.] ALU[Q+D] DEST[MA Q] NORM $ 10m0001 ;MA,Q=Q+1 PAGE 10m0001 10540 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE 10m0001 ] 10m0001 10541 640720014035022010000000 [ D[CONST 1] ROT[9.] ALU[Q+D] DEST[MA Q] NORM $ 10m0001 ;MA,Q=Q+1 PAGE 10m0001 10542 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE 10m0001 10543 640700014131022010000000 ] D[CONST 1] ROT[9.] ALU[D-1] DEST[Q] NORM $ 10m0001 ;Q=1 PAGE - 1 WORD 10m0001 10544 640720024435000440000000 D[MA] ALU[D+Q] DEST[MA] NORM $ 10m0001 ;MA=LAST WORD OF FONT 10m0001 10545 640246000571000440020531 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] LOOP[VIDTFL] CYLEN[FIXM] $ 10m0001 ;TOUCH PAGE LOOP 10m0001 10m0001 ;Turn interrupts back on. 10m0001 10546 640701614571000040000000 D[CONST 4] DEST[DEV-ADR] NORM $ 10m0001 ;DEV-ADR=INTERRUPT 10m0001 10547 640702214571000013600000 D[CONST 1] DEST[IOD] START-OUT NORM $ 10m0001 ;TURN ON INTERRUPTS 10m0001 10550 240700000571000440060000 MAPF[6] C800 $ 10m0001 ;BIT 35 = ON/OFF 10m0001 10551 640701614571000360000000 D[CONST 36] DEST[DEV-ADR] NORM $ 10m0001 ;DEV-ADR=36 10m0001 10m0001 ;If length rememaining not 0, return from interrupt. 10m0001 10552 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10553 640720014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+56. read LENGTH REMAINING 10m0001 10554 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10555 530140004571000440000000 D[MEM] COND[-OBUS=0] JUMP[VIDRET] C550 $ 10m0001 ;If LENGTH REMAINING NEQ 0, return from interrupt 10m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 157 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;Check HALF flag to see if DPYADD. 10m0001 10556 676140000571000440000000 COND[-HALF] JUMP[VIDMHL] NORM $ 10m0001 ;If HALF, DPYADD 10m0001 10m0001 ;Form the display list and POG buffer pointers. 10m0001 10557 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10560 640720074435044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+POG read LENGTH,,BEGINING 10m0001 10561 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10562 640700004171000220000000 D[MEM] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=0,,BEGINING 10m0001 10563 640700004035044170000000 D[MEM] ROT[18.] MASK[15.] ALU[Q+D] DEST[Q] NORM $ 10m0001 ;Q=0,,BEGINING+LENGTH 10m0001 10564 640720034571000440000000 D[IR] DEST[MA] NORM $ 10m0001 ;MA=E read BEGINING 10m0001 10565 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;WAIT 10m0001 10566 640704404575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[HOLD] NORM $ 10m0001 ;HOLD=DISP BEGINING,,POG BEGINING+LENGTH 10m0001 10567 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10570 640724014435000710000000 D[CONST 57.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+57. write DISP BEGINING,,POG BEGINING 10m0001 10571 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10m0001 ;Get length of display list and load control register 10m0001 ;with code for addition. Add to length in POG. 10m0001 10572 640720034571000220000000 D[IR] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=E read LENGTH 10m0001 MAPF[NORM-RD] D[10 + POG,,POGB] MASK[18.] DEST[Q FIXMAC-MAPF-RD] 10m0001 10573 640706074171000220020000 CYLEN[FIXM] $ 10m0001 ;Q=POGB 10m0001 10574 640714404571044170000000 D[MEM] ROT[18.] MASK[15.] DEST[AR HOLD] NORM $ 10m0001 ;AR,HOLD=LENGTH 10m0001 10575 640724014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+56. write LENGTH 10m0001 10576 640702214571074643620000 MAPF[NORM-RD] D[CONST 64] ROT[30.] DEST[IOD] START-OUT NORM $ 10m0001 ;IOD=640000,,000000 10m0001 10577 640720074435044220120000 MAPF[12] D[10 + POG,,POGB] ROT[18.] MASK[18.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;VLDCTR (add) MA=POGB+POG read BACK,LENGTH,,BEGIN 10m0001 10600 640700000171044440020000 MAPF[NORM-RD] D[AR] ROT[18.] DEST[Q] NORM $ 10m0001 ;Q=LENGTH,,0 10m0001 10601 640144204435000440000000 D[MEM] ALU[D+Q] DEST[MEMSTO] JUMP[VIDMLL] NORM $ 10m0001 ;HOLD=BACK,LENGTH+LENGTH,,BEGIN write 10m0001 10m0001 ;This is the outermost loop. It is gone through twice, once with 10m0001 ;first-half-done off subtracting the previous POG buffer, then with 10m0001 ;first-half-done on adding the display list and copying into the 10m0001 ;POG buffer. 10m0001 10m0001 ;Form the display list and POG buffer pointers. 10m0001 10602 640700074171000220000000 VIDMHL: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10603 640720074435044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 158 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;MA=POGB+POG read LENGTH,,BEGINING 10m0001 10604 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10605 640710004171000220000000 D[MEM] MASK[18.] DEST[Q AR] NORM $ 10m0001 ;AR Q=0,,BEGINING 10m0001 10606 640720034571000440000000 D[IR] DEST[MA] NORM $ 10m0001 ;MA=E read BEGINING 10m0001 10607 640706000571000440020000 MAPF[NORM-RD] DEST[FIXMAC-MAPF-RD] CYLEN[FIXM] $ 10m0001 ;WAIT 10m0001 10610 640704404575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[HOLD] NORM $ 10m0001 ;HOLD=DISP BEGINING,,POG BEGINING 10m0001 10611 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10612 640724014435000710000000 D[CONST 57.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+57. write DISP BEGINING,,POG BEGINING 10m0001 10m0001 ;Initialize the remaining length counter for this piece of glass. 10m0001 10613 640700000171000440020000 MAPF[NORM-RD] D[AR] DEST[Q] NORM $ 10m0001 ;Q=BEGINING POG 10m0001 10614 640720014477000020000000 D[CONST 2] ALU[Q-D] DEST[MA] NORM $ 10m0001 ;MA=BEGINING -2 read max length 10m0001 10615 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10616 640704404571000440000000 D[MEM] DEST[HOLD] NORM $ 10m0001 ;HOLD=MAX LENGTH Sigh. HOLD and MEM really are different 10m0001 10617 640724000531000440000000 D[AR] ALU[D-1] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=BEGINING-1 write remaining length 10m0001 10m0001 ;Check for first half done. 10m0001 10620 656140000571000440020000 MAPF[NORM-RD] COND[HALF] JUMP[VIDMHH] NORM $ 10m0001 ;IF -HALF: 10m0001 10m0001 ;If first half not done, get length of POG buffer and load the control 10m0001 ;register with the code for subtraction. 10m0001 10621 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10622 640720074435044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+POG read LENGTH,,BEGINING 10m0001 10623 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10624 640704404571044170000000 D[MEM] ROT[18.] MASK[15.] DEST[HOLD] NORM $ 10m0001 ;HOLD=LENGTH 10m0001 10625 640724014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+56. write LENGTH 10m0001 10626 640702214571074743620000 MAPF[NORM-RD] D[CONST 74] ROT[30.] DEST[IOD] START-OUT NORM $ 10m0001 ;IOD=740000,,000000 10m0001 10627 240140000571000440120000 MAPF[12] JUMP[VIDMLL] C800 $ 10m0001 ;VLDCTR (subtract) 10m0001 10m0001 ;If first half done, get length of display list and load control register 10m0001 ;with code for addition. Put length in POG. 10m0001 10630 640720034571000220000000 VIDMHH: D[IR] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=E read LENGTH 10m0001 MAPF[NORM-RD] D[10 + POG,,POGB] MASK[18.] DEST[Q FIXMAC-MAPF-RD] 10m0001 10631 640706074171000220020000 CYLEN[FIXM] $ 10m0001 ;Q=POGB 10m0001 10632 640714404571044170000000 D[MEM] ROT[18.] MASK[15.] DEST[AR HOLD] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 159 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;AR,HOLD=LENGTH 10m0001 10633 640724014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+56. write LENGTH 10m0001 10634 640702214571074643620000 MAPF[NORM-RD] D[CONST 64] ROT[30.] DEST[IOD] START-OUT NORM $ 10m0001 ;IOD=640000,,000000 10m0001 10635 640720074435044040120000 MAPF[12] D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;VLDCTR (add) MA=POGB+POG read BACK,LENGTH,,BEGIN 10m0001 10636 640700000171044440020000 MAPF[NORM-RD] D[AR] ROT[18.] DEST[Q] NORM $ 10m0001 ;Q=LENGTH,,0 10m0001 10637 640710004571006250000000 D[MEM] ROT[3] MASK[21.] DEST[AR] NORM $ 10m0001 ;AR=BACK,LENGTH,,BEGIN LSH3 ROT21 (LENGTH=0) 10m0001 10640 000704200575102440000000 D[AR] ROT[36. - 3] ALU[DORQ] DEST[MEMSTO] $ 10m0001 ;HOLD=BACK,LENGTH,,BEGIN write 10m0001 10m0001 ;This is the display list or POG buffer loop. It extracts words and 10m0001 ;determines whether they are characters or vectors. 10m0001 10m0001 ;If length = 0, go to end of half-done loop. 10m0001 10641 640700074171000220000000 VIDMLL: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10642 640720014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+56. read LENGTH 10m0001 10643 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;NORM 10m0001 10644 510140004571000220000000 D[MEM] MASK[18.] COND[OBUS=0] JUMP[VIDMHE] C550 $ 10m0001 ;If LENGTH=0, end 10m0001 10m0001 ;Check and update remaining length. 10m0001 10645 640720074435044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+POG read length,,BEGINING 10m0001 10646 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10647 640720004531000220000000 D[MEM] MASK[18.] ALU[D-1] DEST[MA] NORM $ 10m0001 ;MA=BEGINING-1 read length remaining 10m0001 10650 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 D[MEM] ALU[D-1] DEST[MEMSTO] 10m0001 10651 451144204531000440000000 COND[OBUS<0] JUMP[VIDMHE] C600 $ 10m0001 ;HOLD=REMAINING LENGTH-1 write remaining length 10m0001 ;If length remaining-1<0, end this half(add or sub) 10m0001 10m0001 ;Read pointers and chech half. 10m0001 10652 640720014435000710000000 D[CONST 57.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+57. read DISP LIST PTR,,POG BUFF PTR 10m0001 10653 656140000571000440020000 MAPF[NORM-RD] COND[HALF] JUMP[VIDMLH] NORM $ 10m0001 ;If -HALF 10m0001 10m0001 ;If first half not done, read from POG buffer. 10m0001 10654 640720004571000220000000 D[MEM] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=POG BUFF PTR read POG WORD 10m0001 10655 640140000571000440020000 MAPF[NORM-RD] JUMP[VIDMLE] NORM $ 10m0001 ;WAIT 10m0001 10m0001 ;If first half done, read from display list and copy into POG buffer. 10m0001 10656 640720004571044220000000 VIDMLH: D[MEM] ROT[18.] MASK[18.] DEST[MA] NORM $ 10m0001 ;MA=DISP LIST PTR read DISPLAY WORD 10m0001 10657 640700000571000440020000 MAPF[NORM-RD] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 160 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;WAIT 10m0001 10660 640710004571000440000000 D[MEM] DEST[AR] NORM $ 10m0001 ;AR=DISPLAY WORD 10m0001 10661 640720014435000710000000 D[CONST 57.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+57. read DISP LIST PTR,,POG BUFF PTR 10m0001 10662 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10663 640700004171000220000000 D[MEM] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POG BUFF PTR 10m0001 10664 640704400571000440000000 D[AR] DEST[HOLD] NORM $ 10m0001 ;HOLD=DISPLAY WORD 10m0001 10665 640724000555000440000000 ALU[Q] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POG BUFF PTR write DISPLAY WORD 10m0001 10666 640704400571000440020000 MAPF[NORM-RD] D[AR] DEST[HOLD] NORM $ 10m0001 ;HOLD=DISPLAY WORD 10m0001 ;;;Please note the above kludge. This is necessary because HOLD 10m0001 ;;;forgets its data whenever MA changes, even on a write (contrary 10m0001 ;;;to the explanation in the microcode manual). 10m0001 10m0001 ;Decode opcode of display word (character or vector). 10m0001 10667 640700204571000443000000 VIDMLE: D[MEM] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 10m0001 ;INTEN,,FRACT=NEXT WORD 10m0001 D[MEM] MASK[1] 10m0001 10670 530140004571000010000000 COND[-OBUS=0] JUMP[VIDCHI] C550 $ 10m0001 ;If bit 35=1, character 10m0001 10671 640700004171000040000000 D[MEM] MASK[4] DEST[Q] NORM $ 10m0001 ;Q=4 LSB'S 10m0001 D[CONST 06] ALU[Q#D] 10m0001 10672 510140014735000060000000 COND[OBUS=0] JUMP[VIDVCI] C550 $ 10m0001 ;If 4 lsb's=0110, vector 10m0001 10m0001 ;Decrement length, and increment pointers. 10m0001 10673 640700074171000220000000 VIDDON: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10674 640720014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+56. read LENGTH 10m0001 10675 640700000571000440020000 MAPF[NORM-RD] NORM $ 10m0001 ;WAIT 10m0001 10676 640704204531000440000000 D[MEM] ALU[D-1] DEST[MEMSTO] NORM $ 10m0001 ;HOLD=LENGTH-1 write LENGTH 10m0001 10677 640720014435000710000000 D[CONST 57.] ALU[Q+D] DEST[MA] NORM $ 10m0001 ;MA=POGB+57. read DISP LIST PTR,,POG BUFF PTR 10m0001 10700 640700014171001000020000 MAPF[NORM-RD] D[CONST 1,,1] DEST[Q] NORM $ 10m0001 ;Q=1,,1 10m0001 10701 640144204435000440000641 D[MEM] ALU[D+Q] DEST[MEMSTO] JUMP[VIDMLL] NORM $ 10m0001 ;HOLD=DISP LIST PTR,,POG BUFF PTR + 1,,1 write 10m0001 10m0001 ;Zero length remaining (so won't try to recover from interrupt). 10m0001 10702 640704400615000440000000 VIDMHE: ALU[0] DEST[HOLD] NORM $ 10m0001 ;HOLD=0 10m0001 10703 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 10m0001 ;Q=POGB 10m0001 10704 640724014435000700000000 D[CONST 56.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 10m0001 ;MA=POGB+56. write LENGTH REMAINING 10m0001 10m0001 ;If first half done, terminate. If not, set HALF flag and loop 10m0001 10705 656140000571000440020000 MAPF[NORM-RD] COND[HALF] JUMP[VIDEND] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 161 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 10m0001 ;If HALF, end 10m0001 10706 640700014171076010000000 D[CONST 1] ROT[35. - 4] DEST[Q] NORM $ 10m0001 ;Q=bit 4 on 10m0001 10707 640145420575000440000602 D[PC] ALU[DORQ] DEST[CRYOV] JUMP[VIDMHL] NORM $ 10m0001 ;Set HALF flag and loop 10m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 162 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 11m0001 ;Interrupt and End 11m0001 ;Save AMEM and go to MAIN to take interrupt. 11m0001 10710 640144620531000440020000 VIDINT: MAPF[NORM-RD] D[PC] ALU[D-1] DEST[PC] JUMP[VIDSAM] NORM $ 11m0001 ;PC=PC-1 11m0001 10711 640700000571000442200000 VIDEND: SPEC[CLR-HALF] NORM $ 11m0001 ;Clear HALF 11m0001 10712 640700074171000220000000 VIDSAM: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 11m0001 ;Q=POGB 11m0001 10713 640700014035014010000000 D[CONST 1] ROT[6] ALU[Q+D] DEST[Q] NORM $ 11m0001 ;Q=POGB+64. 11m0001 0 %VIDFOO = 0 11m0001 .REPEAT 8. 11m0001 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 11m0001 10714 640704440571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10715 640724014435000000000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 1 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10716 640704444571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10717 640724014435000010000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 2 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10720 640704450571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10721 640724014435000020000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 3 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10722 640704454571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10723 640724014435000030000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 4 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10724 640704460571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10725 640724014435000040000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 5 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10726 640704464571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10727 640724014435000050000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 6 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10730 640704470571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 163 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 11m0001 10731 640724014435000060000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 7 %VIDFOO = %VIDFOO + 1 11m0001 ] 11m0001 10732 640704474571000440020000 [ MAPF[NORM-RD] D[10 + %VIDFOO] DEST[HOLD] NORM $ 11m0001 ;HOLD=AMEM[%VIDFOO] 11m0001 10733 640724014435000070000000 D[CONST %VIDFOO] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 11m0001 ;MA=POGB+64.+%VIDFOO write 11m0001 10 %VIDFOO = %VIDFOO + 1 11m0001 10734 640141600615000440020350 ] MAPF[NORM-RD] ALU[0] DEST[DEV-ADR] JUMP[GOMAIN] NORM $ 11m0001 ;Reset device address, dispatch to interrupt or next instr. 11m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 164 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 12m0001 ;Recovery 12m0001 ;Restore AMEM. 12m0001 10735 640700074171000220000000 VIDRET: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 12m0001 ;Q=POGB 12m0001 10736 640700014035014010000000 D[CONST 1] ROT[6] ALU[Q+D] DEST[Q] NORM $ 12m0001 ;Q=POGB+64. 12m0001 0 %VIDFOO = 0 12m0001 .REPEAT 8. 12m0001 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 12m0001 10737 640720014435000000000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10740 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10741 640700004571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 1 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10742 640720014435000010000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10743 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10744 640700204571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 2 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10745 640720014435000020000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10746 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10747 640700404571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 3 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10750 640720014435000030000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10751 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10752 640700604571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 4 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10753 640720014435000040000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10754 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10755 640701004571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 5 %VIDFOO = %VIDFOO + 1 12m0001 ] ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 165 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 12m0001 10756 640720014435000050000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10757 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10760 640701204571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 6 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10761 640720014435000060000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10762 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10763 640701404571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 7 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 10764 640720014435000070000000 [ D[CONST %VIDFOO] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+64.+%VIDFOO read 12m0001 10765 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 10766 640701604571000443000000 D[MEM] DEST[%VIDFOO] DEST-A-MEM NORM $ 12m0001 ;AMEM[%VIDFOO]=MEM 12m0001 10 %VIDFOO = %VIDFOO + 1 12m0001 ] 12m0001 ;Check for first half done. 12m0001 D[10 + POG,,POGB] MASK[18.] DEST[Q] 12m0001 10767 656140074171000220000000 COND[HALF] JUMP[VIDRIH] NORM $ 12m0001 ;Q=POGB If -HALF 12m0001 12m0001 ;If first half not done, default color = modified last color 12m0001 ;and xor mask = -1. 12m0001 10770 640720014435000600000000 D[CONST 48.] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+48. read LAST COLOR 12m0001 10771 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 12m0001 ;AR=077777,,777777 12m0001 10772 640700004171000440000000 D[MEM] DEST[Q] NORM $ 12m0001 ;Q=LAST COLOR,,LAST FONT 12m0001 D[MEM] ROT[2] MASK[2] 12m0001 10773 510140004571004020000000 COND[OBUS=0] JUMP[VIDRIM] C550 $ 12m0001 ;If color>1 12m0001 10774 640700014175102070000000 D[CONST 7] ROT[33.] ALU[DORQ] DEST[Q] NORM $ 12m0001 ;Q=COLOR 7 (WHITE FROM COLOR) 12m0001 VIDRIM: 12m0001 .REPEAT VIC2 [ 12m0001 D[AR] ALU[DORQ] DEST[IOD] START-OUT NORM $ 12m0001 ;IOD=MODIFIED LAST COLOR 77777,,777777 12m0001 ];VIC2 12m0001 .REPEAT 1 - VIC2 [ 12m0001 D[AR] ALU[DORQ] DEST[HOLD] NORM $ 12m0001 ;MEM=MODIFIED LAST COLOR 77777,,777777 12m0001 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 12m0001 ;Q=POGB 12m0001 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 12m0001 ;MA=POGB+59 write 12m0001 MAPF[NORM-RD] JUMP[VIDRIE] NORM $ 12m0001 ;WAIT 12m0001 ];[ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 166 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 12m0001 10775 640704400575000440000000 D[AR] ALU[DORQ] DEST[HOLD] NORM $ 12m0001 ;MEM=MODIFIED LAST COLOR 77777,,777777 12m0001 10776 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 12m0001 ;Q=POGB 12m0001 10777 640724014435000730000000 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 12m0001 ;MA=POGB+59 write 12m0001 11000 640140000571000440020000 MAPF[NORM-RD] JUMP[VIDRIE] NORM $ 12m0001 ;WAIT 12m0001 ]1-VIC2 12m0001 12m0001 ;If first half done, default color = last color, and xor mask = 0. 12m0001 11001 640720014435000600000000 VIDRIH: D[CONST 48.] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+48. read LAST COLOR 12m0001 11002 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 12m0001 ;AR=077777,,777777 12m0001 11003 640700004171000440000000 D[MEM] DEST[Q] NORM $ 12m0001 ;Q=LAST COLOR,,LAST FONT 12m0001 .REPEAT VIC2 [ 12m0001 D[AR] ALU[-D&Q] DEST[IOD] START-OUT NORM $ 12m0001 ;IOD=LAST COLOR 00000,,000000 12m0001 ];VIC2 12m0001 .REPEAT 1 - VIC2 [ 12m0001 D[AR] ALU[-D&Q] DEST[HOLD] NORM $ 12m0001 ;MEM=LAST COLOR 00000,,000000 12m0001 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 12m0001 ;Q=POGB 12m0001 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 12m0001 ;MA=POGB+59 write 12m0001 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 ];[ 12m0001 11004 640704400675000440000000 D[AR] ALU[-D&Q] DEST[HOLD] NORM $ 12m0001 ;MEM=LAST COLOR 00000,,000000 12m0001 11005 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 12m0001 ;Q=POGB 12m0001 11006 640724014435000730000000 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 12m0001 ;MA=POGB+59 write 12m0001 11007 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 ]1-VIC2 12m0001 12m0001 ;Dispatch to saved microcode address to resume from interrupt. 12m0001 11010 240700074171000220100000 VIDRIE: MAPF[10] D[10 + POG,,POGB] MASK[18.] DEST[Q] C800 $ 12m0001 ;VLDCOL Q=POGB 12m0001 11011 640720014435000720000000 D[CONST 58.] ALU[Q+D] DEST[MA] NORM $ 12m0001 ;MA=POGB+58. read SAVE ADR 12m0001 11012 640700000571000440020000 MAPF[NORM-RD] NORM $ 12m0001 ;WAIT 12m0001 11013 540540004571000440000000 D[MEM] SDISP C500 $ 12m0001 ;Dispatch on SAVE ADR 12m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 167 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 13m0001 ;Character A-MEM: 13m0001 13m0001 0 WORD,,PIXEL3 = 0 13m0001 1 YSIZE-1,,FONTPTR = 1 13m0001 2 XMAX,,XMIN = 2 13m0001 3 YMAX,,YMIN = 3 13m0001 4 COLOR = 4 13m0001 5 XSIZE3,,XSIZE = 5 13m0001 6 LINE,,BYTEPTR = 6 13m0001 7 POG,,POGB = 7 13m0001 13m0001 ;Note: The zeroth word of the font contains HEIGHT,,WIDTH 13m0001 ;for that font. 13m0001 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 168 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0001 ;Character body 14m0001 14m0001 ;Get initial word and 3*pixel. 14m0001 11014 640700074171000220000000 VIDCHI: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11015 640720014435000750000000 D[CONST 61.] ALU[Q+D] DEST[MA] NORM $ 14m0001 ;MA=POGB+61. read X0,,X1 14m0001 11016 640700014131014050020000 MAPF[NORM-RD] D[CONST 5] ROT[6] ALU[D-1] DEST[Q] NORM $ 14m0001 ;Q=319. 14m0001 11017 640710004435000220000000 D[MEM] MASK[18.] ALU[D+Q] DEST[AR] NORM $ 14m0001 ;AR=X1+319. (0=left hand edge) 14m0001 11020 640710000171000220000000 D[AR] MASK[18.] DEST[Q AR] NORM $ 14m0001 ;Q,AR=X1+319. (eliminate carry across halfwords) 14m0001 11021 640050000435002440000000 D[AR] ROT[1] ALU[D+Q] DEST[AR] PUSHJ[VIDD33] NORM $ 14m0001 ;AR=3*(corrected X coordinate), divide by 33 14m0001 11022 640700004575044443000000 D[MEM] ROT[18.] ALU[DORQ] DEST[WORD,,PIXEL3] DEST-A-MEM NORM $ 14m0001 ;WORD,,PIXEL3=QUOTIENT,,REMAINDER 14m0001 14m0001 ;Initialize line and byte pointers. 14m0001 11023 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 14m0001 ;MA=POGB+62. read Y0,,Y1 14m0001 11024 640700014171060040020000 MAPF[NORM-RD] D[CONST 4] ROT[18. + 6] DEST[Q] NORM $ 14m0001 ;Q=256,,0 14m0001 11025 640700004035044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=Y1+256.,,0 14m0001 11026 640701414575000073000000 D[CONST 7] ALU[DORQ] DEST[LINE,,BYTEPTR] DEST-A-MEM NORM $ 14m0001 ;LINE,,BYTEPTR=Y1+256.,,7 14m0001 14m0001 ;Form XMAX,,XMIN 14m0001 11027 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11030 640700074035044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[Q] NORM $ 14m0001 ;Q=POGB+POG 14m0001 11031 640720014435000200000000 D[CONST 16.] ALU[Q+D] DEST[MA] NORM $ 14m0001 ;MA=POGB+16.+POG read XMAX,,XMIN 14m0001 11032 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11033 640700404571000443000000 D[MEM] DEST[XMAX,,XMIN] DEST-A-MEM NORM $ 14m0001 ;XMAX,,XMIN 14m0001 14m0001 ;Form YMAX,,YMIN 14m0001 11034 640700024171000440000000 D[MA] DEST[Q] NORM $ 14m0001 ;Q=MA 14m0001 11035 640720014435000200000000 D[CONST 16.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+32.+POG read YMAX,,YMIN 14m0001 11036 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11037 640700604571000443000000 D[MEM] DEST[YMAX,,YMIN] DEST-A-MEM NORM $ 14m0001 ;YMAX,,YMIN 14m0001 14m0001 ;Test HALF flag. 14m0001 D[10 + POG,,POGB] MASK[18.] DEST[Q] 14m0001 11040 656140074171000220000000 COND[HALF] JUMP[VIDCHH] NORM $ 14m0001 ;Q=POGB if -HALF 14m0001 14m0001 ;If not HALF, subtract old image with color=last color. 14m0001 11041 640720014435000600000000 D[CONST 48.] ALU[D+Q] DEST[MA] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 169 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0001 ;MA=POGB+48. read LAST COLOR 14m0001 11042 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 14m0001 ;AR=077777,,777777 14m0001 11043 640700004171000440000000 D[MEM] DEST[Q] NORM $ 14m0001 ;Q=LAST COLOR,,LAST FONT 14m0001 D[MEM] ROT[2] MASK[2] 14m0001 11044 510140004571004020000000 COND[OBUS=0] JUMP[VIDCHM] C550 $ 14m0001 ;If color>1 14m0001 11045 640700014175102070000000 D[CONST 7] ROT[33.] ALU[DORQ] DEST[Q] NORM $ 14m0001 ;Q=COLOR 7 (WHITE FROM COLOR) 14m0001 VIDCHM: 14m0001 11046 640141000575000443000000 D[AR] ALU[DORQ] DEST[COLOR] DEST-A-MEM JUMP[VIDSCL] NORM $ 14m0001 ;COLOR=modified last color 77777,,777777 14m0001 14m0001 ;If HALF, add new image with last color. 14m0001 11047 640720014435000600000000 VIDCHH: D[CONST 48.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+48. read LAST COLOR 14m0001 11050 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 14m0001 ;AR=077777,,777777 14m0001 11051 640700004171000440000000 D[MEM] DEST[Q] NORM $ 14m0001 ;Q=LAST COLOR,,LAST FONT 14m0001 11052 640701000675000443000000 D[AR] ALU[-D&Q] DEST[COLOR] DEST-A-MEM NORM $ 14m0001 ;COLOR=LAST COLOR 00000,,000000 14m0001 14m0001 ;This is the character scanning loop. 14m0001 14m0001 ;Set up font pointer. Flush nulls. 14m0001 11053 640700074171000220000000 VIDSCL: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11054 640720014435000710000000 D[CONST 57.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+57. read DISPLAY BUFFER POINTER 14m0001 11055 656140000571000440020000 MAPF[NORM-RD] COND[HALF] JUMP[VIDSC1] NORM $ 14m0001 ;If -HALF 14m0001 11056 640160004571000220000000 D[MEM] MASK[18.] DEST[MA] JUMP[VIDSC2] NORM $ 14m0001 ;MA=POG PTR read 14m0001 11057 640720004571044220000000 VIDSC1: D[MEM] ROT[18.] MASK[18.] DEST[MA] NORM $ 14m0001 ;MA=DISP PTR read 14m0001 11060 640701270571000440020000 VIDSC2: MAPF[NORM-RD] D[10 + LINE,,BYTEPTR] DEST[ROTR] NORM $ 14m0001 ;ROTR=LINE,,BYTEPTR 14m0001 D[MEM] ROT[R] MASK[7] DEST[AR] 14m0001 11061 510150004571200070000000 COND[OBUS=0] JUMP[VIDSCN] C550 $ 14m0001 ;AR=ASCII if 0, next character 14m0001 11062 640720014435000600000000 D[CONST 48.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+48. read LAST FONT 14m0001 11063 640700000171010440020000 MAPF[NORM-RD] D[AR] ROT[4] DEST[Q] NORM $ 14m0001 ;Q=0,,ASCII*16. 14m0001 11064 640700204435000223000000 D[MEM] MASK[18.] ALU[D+Q] DEST[YSIZE-1,,FONTPTR] DEST-A-MEM NORM $ 14m0001 ;YSIZE-1,,FONTPTR=0,,LAST FONT+ASCII*16. 14m0001 14m0001 ;Get width and 3*width of character. 14m0001 11065 640700044171000220000000 D[10 + YSIZE-1,,FONTPTR] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=FONTPTR 14m0001 11066 640720014435000170000000 D[CONST 15.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=FONTPTR+15. read YSIZE,,XSIZE 14m0001 11067 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11070 640710004171000220000000 D[MEM] MASK[18.] DEST[AR Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 170 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0001 ;AR,Q=0,,XSIZE 14m0001 11071 640700000035044440000000 D[AR] ROT[18.] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=XSIZE,,XSIZE 14m0001 11072 640701200435046443000000 D[AR] ROT[18. + 1] ALU[D+Q] DEST[XSIZE3,,XSIZE] DEST-A-MEM NORM $ 14m0001 ;XSIZE3,,XSIZE=XSIZE*3,,XSIZE 14m0001 14m0001 ;Initialize YSIZE-1 14m0001 11073 640700004171000000200000 D[MEM] SPEC[LEFT] DEST[Q] NORM $ 14m0001 ;Q=YSIZE,,0 14m0001 11074 640700044175000440000000 D[10 + YSIZE-1,,FONTPTR] ALU[DORQ] DEST[Q] NORM $ 14m0001 ;Q=YSIZE,,FONTPTR 14m0001 11075 640700214477044013000000 D[CONST 1] ROT[18.] ALU[Q-D] DEST[YSIZE-1,,FONTPTR] DEST-A-MEM NORM $ 14m0001 ;YSIZE-1,,FONTPTR 14m0001 14m0001 ;Increment position one character width (right or down). 14m0001 11076 640710004171000000200000 D[MEM] SPEC[LEFT] DEST[Q AR] NORM $ 14m0001 ;AR,Q=YSIZE,,0 14m0001 D[MEM] ROT[18.] SPEC[LEFT] ALU[Q-D] 14m0001 11077 451140004477044000200000 COND[OBUS<0] JUMP[VIDCCS] C600 $ 14m0001 ;If YSIZE-XSIZE<0, sideways 14m0001 14m0001 ;Update normal X0,,X1. 14m0001 11100 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11101 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+61. read X0,,X1 14m0001 11102 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11103 640700004171000220000000 D[MEM] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=0,,X1 14m0001 11104 640710064435000220000000 D[10 + XSIZE3,,XSIZE] MASK[18.] ALU[D+Q] DEST[AR] NORM $ 14m0001 ;AR=0,,X1+XSIZE 14m0001 11105 640700004171044000200000 D[MEM] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 14m0001 ;Q=X1,,0 14m0001 11106 640704200575000220000000 D[AR] MASK[18.] ALU[DORQ] DEST[MEMSTO] NORM $ 14m0001 ;HOLD=X1,,X1+XSIZE write X0,,X1 14m0001 14m0001 ;Update normal Y0,,Y1. 14m0001 11107 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 14m0001 ;MA=POGB+62. read Y0,,Y1 14m0001 11110 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11111 000700004171000220000000 D[MEM] MASK[18.] DEST[Q] $ 14m0001 ;Q=0,,Y1 14m0001 11112 640144204575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[MEMSTO] JUMP[VIDCCL] NORM $ 14m0001 ;HOLD=Y1,,Y1 write Y0,,Y1 14m0001 14m0001 ;Update sideways X0,,X1. 14m0001 11113 640700074171000220000000 VIDCCS: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11114 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=POGB+61. read X0,,X1 14m0001 11115 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11116 000700004171000220000000 D[MEM] MASK[18.] DEST[Q] $ 14m0001 ;Q=0,,X1 14m0001 11117 640704204575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[MEMSTO] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 171 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0001 ;HOLD=X1,,X1 write X0,,X1 14m0001 14m0001 ;Update sidways Y0,,Y1. 14m0001 11120 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 14m0001 ;MA=POGB+62. read Y0,,Y1 14m0001 11121 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11122 640700004171000220000000 D[MEM] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=0,,Y1 14m0001 11123 640710000477044440000000 D[AR] ROT[18.] ALU[Q-D] DEST[AR] NORM $ 14m0001 ;AR=0,,Y1-YSIZE 14m0001 11124 640700004171044000200000 D[MEM] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 14m0001 ;Q=Y1,,0 14m0001 11125 640704200575000220000000 D[AR] MASK[18.] ALU[DORQ] DEST[MEMSTO] NORM $ 14m0001 ;HOLD=Y1,,Y1-YSIZE write Y0,,Y1 14m0001 14m0001 ;Check X limits. 14m0001 11126 640720024531000440000000 VIDCCL: D[MA] ALU[D-1] DEST[MA] NORM $ 14m0001 ;MA=POGB+61 read X0,,X1 14m0001 11127 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11130 640700004171000000200000 D[MEM] SPEC[LEFT] DEST[Q] NORM $ 14m0001 ;Q=X0,,0 14m0001 D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] ALU[Q-D] 14m0001 11131 451140050477044000200000 COND[OBUS<0] JUMP[VIDCHE] C600 $ 14m0001 ;if X0,,0-XMIN,,0<0 skip 14m0001 11132 640700064035044000200000 D[10 + XSIZE3,,XSIZE] ROT[18.] SPEC[LEFT] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=X0,,0+XSIZE,,0 14m0001 D[10 + XMAX,,XMIN] SPEC[LEFT] ALU[D-Q] 14m0001 11133 451140050537000000200000 COND[OBUS<0] JUMP[VIDCHE] C600 $ 14m0001 ;if XMAX,,0-(X0+XSIZE),,0<0 skip 14m0001 14m0001 ;Check Y limits. 14m0001 11134 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 14m0001 ;MA=POGB+62 read Y0,,Y1 14m0001 11135 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0001 ;WAIT 14m0001 11136 640700004171000000200000 D[MEM] SPEC[LEFT] DEST[Q] NORM $ 14m0001 ;Q=Y0,,0 14m0001 D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] ALU[Q-D] 14m0001 11137 451140054477044000200000 COND[OBUS<0] JUMP[VIDCHE] C600 $ 14m0001 ;if Y0,,0-YMIN,,0<0 skip 14m0001 11140 640700044035000000200000 D[10 + YSIZE-1,,FONTPTR] SPEC[LEFT] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=Y0,,0+YSIZE-1,,0 14m0001 11141 640700014035044010000000 D[CONST 1] ROT[18.] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=Y0,,0+YSIZE,,0 14m0001 D[10 + YMAX,,YMIN] SPEC[LEFT] ALU[D-Q] 14m0001 11142 451140054537000000200000 COND[OBUS<0] JUMP[VIDCHE] C600 $ 14m0001 ;if YMAX,,0-(Y0+YSIZE),,0<0 skip 14m0001 14m0001 ;This is the scan line loop for characters. 14m0001 14m0001 ;Put up first word of this line for this character. 14m0001 11143 640700044171000220000000 VIDCHL: D[10 + YSIZE-1,,FONTPTR] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=FONTPTR 14m0001 11144 640720044435044220000000 D[10 + YSIZE-1,,FONTPTR] ROT[18.] MASK[18.] ALU[D+Q] DEST[MA] NORM $ 14m0001 ;MA=FONTPTR+YSIZE-1 read DATA ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 172 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0001 11145 640700014171000410020000 MAPF[NORM-RD] D[CONST 33.] DEST[Q] NORM $ 14m0001 ;Q=33. 14m0001 11146 640701240477000220000000 D[10 + WORD,,PIXEL3] MASK[18.] ALU[Q-D] DEST[ROTR] NORM $ 14m0001 ;ROTR=33.-PIXEL3 14m0001 11147 640701440477000220000000 D[10 + WORD,,PIXEL3] MASK[18.] ALU[Q-D] DEST[MASKR] NORM $ 14m0001 ;MASKR=33.-PIXEL3 14m0001 11150 640044404571201000000000 D[MEM] ROT[R] MASK[R] DEST[HOLD] PUSHJ[VIDPUT] NORM $ 14m0001 ;HOLD=DATA ROT (33.-PIXEL) MASK (33.-PIXEL) do it 14m0001 14m0001 ;Determine if there is another word. 14m0001 11151 240700040171000220070000 MAPF[7] D[10 + WORD,,PIXEL3] MASK[18.] DEST[Q] C800 $ 14m0001 ;Q=PIXEL3 VWEVID 14m0001 11152 640700064035044220000000 D[10 + XSIZE3,,XSIZE] ROT[18.] MASK[18.] ALU[D+Q] DEST[Q] NORM $ 14m0001 ;Q=PIXEL3+XSIZE3 14m0001 D[CONST 33.] ALU[D-Q] 14m0001 11153 471140014537000410000000 COND[-OBUS<0] JUMP[VIDCHS] C600 $ 14m0001 ;If 33.-(PIXEL3+XSIZE3)<0 14m0001 14m0001 ;If there is a second word, put it up. 14m0001 11154 640700040171000440000000 D[10 + WORD,,PIXEL3] DEST[Q] NORM $ 14m0001 ;Q=WORD,,PIXEL 14m0001 11155 640700014435044013000000 D[CONST 1] ROT[18.] ALU[Q+D] DEST[WORD,,PIXEL3] DEST-A-MEM NORM $ 14m0001 ;Temporarally increment WORD 14m0001 11156 640720024571000440000000 D[MA] DEST[MA] NORM $ 14m0001 ;Read line of data again. (Not enough state.) 14m0001 11157 640700014171000360000000 D[CONST 30.] DEST[Q] NORM $ 14m0001 ;Q=30. 14m0001 11160 640701240477000220000000 D[10 + WORD,,PIXEL3] MASK[18.] ALU[Q-D] DEST[ROTR] NORM $ 14m0001 ;ROTR=30.-PIXEL3 14m0001 11161 640710004571200410000000 D[MEM] ROT[R] MASK[33.] DEST[AR] NORM $ 14m0001 ;AR=DATA ROT (30.-PIXEL3) MASK 33. 14m0001 11162 640700014171002410000000 D[CONST 33.] ROT[1] DEST[Q] NORM $ 14m0001 ;Q=66. 14m0001 11163 640700040077000220000000 D[10 + WORD,,PIXEL3] MASK[18.] ALU[Q-D] DEST[Q] NORM $ 14m0001 ;Q=66.-PIXEL3 14m0001 11164 640701464477044220000000 D[10 + XSIZE3,,XSIZE] ROT[18.] MASK[18.] ALU[Q-D] DEST[MASKR] NORM $ 14m0001 ;MASKR=66.-PIXEL3-XSIZE3 14m0001 11165 640700000171000440000000 D[AR] DEST[Q] NORM $ 14m0001 ;Q=DATA ROT(30.-PIXEL3) MASK(33.) 14m0001 11166 640044400675001000000000 D[MASK R] ALU[-D&Q] DEST[HOLD] PUSHJ[VIDPUT] NORM $ 14m0001 ;HOLD=DATA ROT(30.-PIXEL3) MASK(66.-PIXEL3-XSIZE3) 14m0001 11167 640700040171000440070000 MAPF[7] D[10 + WORD,,PIXEL3] DEST[Q] NORM $ 14m0001 ;Q=WORD,,PIXEL VWEVID 14m0001 11170 640700014477044013000000 D[CONST 1] ROT[18.] ALU[Q-D] DEST[WORD,,PIXEL3] DEST-A-MEM NORM $ 14m0001 ;Redecrement WORD 14m0001 14m0001 ;Check for last scan line of character (also interrupts). 14m0001 11171 240700044171000440070000 VIDCHS: MAPF[7] D[10 + YSIZE-1,,FONTPTR] DEST[Q] C800 $ 14m0001 ;Q=YSIZE-1,,FONTPTR VWEVID 14m0001 D[CONST 1] ROT[18.] ALU[Q-D] DEST[YSIZE-1,,FONTPTR] DEST-A-MEM 14m0001 11172 451140214477044013000000 COND[OBUS<0] JUMP[VIDCHE] C600 $ 14m0001 ;If YSIZE-1<0, done 14m0001 11173 661140000571000440001143 COND[-INTRPT] JUMP[VIDCHL] NORM $ 14m0001 ;If no interrupt, loop 14m0001 VIDSAV[VIDCHL] 14m0001 14m0001 11174 640700014171030010000000 [ D[CONST (VIDCHL / 10000)] ROT[12.] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 173 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 14m0001 ;Q=high bit (SDISP loads all 16 bits) 14m0001 11175 640700014175014110000000 D[CONST (77 & (VIDCHL / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 14m0001 ;Q=next 6 ADR bits 14m0001 11176 640704414575000430000000 D[CONST (VIDCHL \ 100)] ALU[QORD] DEST[HOLD] NORM $ 14m0001 ;Q=SAVE ADR 14m0001 11177 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 14m0001 ;Q=POGB 14m0001 11200 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 14m0001 ;MA=POGB+58 write SAVE ADR 14m0002 ] ;Interrupt 14m0002 14m0002 ;Increment position one character width (right or down). 14m0002 11201 640700044171000220000000 VIDCHE: D[10 + YSIZE-1,,FONTPTR] MASK[18.] DEST[Q] NORM $ 14m0002 ;Q=PONTPTR 14m0002 11202 640720014435000170000000 D[CONST 15.] ALU[Q+D] DEST[MA] NORM $ 14m0002 ;MA=POGB+15. read YSIZE,,XSIZE 14m0002 11203 640700000571000440020000 MAPF[NORM-RD] NORM $ 14m0002 ;WAIT 14m0002 11204 640700004171000000200000 D[MEM] SPEC[LEFT] DEST[Q] NORM $ 14m0002 ;Q=YSIZE,,0 14m0002 D[MEM] ROT[18.] SPEC[LEFT] ALU[Q-D] 14m0002 11205 451140004477044000200000 COND[OBUS<0] JUMP[VIDCE2] C600 $ 14m0002 ;If YSIZE-XSIZE<0, sideways 14m0002 14m0002 11206 640700064171000000200000 D[10 + XSIZE3,,XSIZE] SPEC[LEFT] DEST[Q] NORM $ 14m0002 ;Q=XSIZE3,,0 14m0002 11207 640700040035044000200000 D[10 + WORD,,PIXEL3] ROT[18.] SPEC[LEFT] ALU[Q+D] DEST[Q] NORM $ 14m0002 ;Q=PIXEL3+XSIZE3,,0 14m0002 D[CONST 33.] ROT[18.] ALU[Q-D] 14m0002 11210 451140014477044410000000 COND[OBUS<0] JUMP[VIDCE1] C600 $ 14m0002 ;If PIXEL3+XSIZE3-33.<0 skip 14m0002 11211 640700014077044410000000 D[CONST 33.] ROT[18.] ALU[Q-D] DEST[Q] NORM $ 14m0002 ;Q=PIXEL3+XSIZE3-33.,,0 14m0002 11212 640700000017000440000000 ALU[Q+1] DEST[Q] NORM $ 14m0002 ;Q=PIXEL3+XSIZE3-33.,,1 14m0002 11213 640710000555000440000000 VIDCE1: ALU[Q] DEST[AR] NORM $ 14m0002 ;AR=NEW PIXEL3,,WORD OFFSET 14m0002 11214 640700040171000000200000 D[10 + WORD,,PIXEL3] SPEC[LEFT] DEST[Q] NORM $ 14m0002 ;Q=WORD,,0 14m0002 D[AR] ROT[18.] ALU[D+Q] DEST[WORD,,PIXEL3] DEST-A-MEM 14m0002 11215 640140000435044443000000 JUMP[VIDSCN] NORM $ 14m0002 ;WORD,,PIXEL3=WORD+OFFSET,,NEW PIXEL3 14m0002 14m0002 11216 640700070171000440000000 VIDCE2: D[10 + LINE,,BYTEPTR] DEST[Q] NORM $ 14m0002 ;Q=LINE,,BYTEPTR 14m0002 11217 640700004077000000200000 D[MEM] SPEC[LEFT] ALU[Q-D] DEST[Q] NORM $ 14m0002 ;Q=LINE-YSIZE,,BYTEPTR 14m0002 11220 640701400555000443000000 ALU[Q] DEST[LINE,,BYTEPTR] DEST-A-MEM NORM $ 14m0002 ;LINE-YSIZE,,BYTEPTR 14m0002 14m0002 14m0002 ;Increment byte pointer for next character. 14m0002 11221 640700070171000440000000 VIDSCN: D[10 + LINE,,BYTEPTR] DEST[Q] NORM $ 14m0002 ;Q=LINE,,BYTEPTR 14m0002 11222 640711414435000073000000 D[CONST 7] ALU[Q+D] DEST[AR LINE,,BYTEPTR] DEST-A-MEM NORM $ 14m0002 ;AR,LINE,,BYTEPTR=LINE,,BYTEPTR+7 14m0002 11223 640700000171044000200000 D[AR] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 174 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 14m0002 ;Q=BYTEPTR+7,,0 14m0002 D[CONST 36.] ROT[18.] ALU[D-Q] 14m0002 11224 471140014537044440001053 COND[-OBUS<0] JUMP[VIDSCL] C600 $ 14m0002 ;If 36.,,0-BYTEPTR+7,,0<0 14m0002 11225 640140000571000440000673 JUMP[VIDDON] NORM $ 14m0002 ;Done 14m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 175 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 15m0002 ;Divide by 33. (Efficient till 2048./33.) 15m0002 15m0002 ;AR=DIVIDEND 15m0002 15m0002 11226 640704400171076370000000 VIDD33: D[AR] ROT[36. - 5] MASK[36. - 5] DEST[Q HOLD] NORM $ 15m0002 ;Q,HOLD=QUOTIENT=AR/32. 15m0002 11227 640700004035012440000000 VID33L: D[MEM] ROT[5] ALU[D+Q] DEST[Q] NORM $ 15m0002 ;Q=33*QUOTIENT 15m0002 D[AR] ALU[D-Q] DEST[Q] 15m0002 11230 471300000137000440000000 COND[-OBUS<0] POPJ C600 $ 15m0002 ;Q=REMAINDER, if < 0 15m0002 11231 640144404131000440001227 D[MEM] ALU[D-1] DEST[Q HOLD] JUMP[VID33L] NORM $ 15m0002 ;Q,HOLD=QUOTIENT-1 loop 15m0002 15m0002 ;MEM=QUOTIENT 15m0002 ;Q=REMAINDER 15m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 176 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 16m0002 ;Put up one word of video 16m0002 16m0002 ;MEM=DATA 16m0002 16m0002 11232 640700070171044220000000 VIDPUT: D[10 + LINE,,BYTEPTR] ROT[18.] MASK[18.] DEST[Q] NORM $ 16m0002 ;Q=0,,LINE 16m0002 11233 640710044477044220000000 D[10 + YSIZE-1,,FONTPTR] ROT[18.] MASK[18.] ALU[Q-D] DEST[AR] NORM $ 16m0002 ;AR=0,,LINE-(YSIZE-1) 16m0002 11234 640700000171012440000000 D[AR] ROT[5] DEST[Q] NORM $ 16m0002 ;Q=0 LINE 00000 16m0002 11235 640700014275012010000000 D[CONST 1] ROT[5] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Q=0 LINE/2 000000 16m0002 D[AR] ROT[36. - 1] 16m0002 11236 531140000571106440000000 COND[-OBUS<0] JUMP[VIDPT1] C550 $ 16m0002 ;IF LSB[LINE]=1 16m0002 11237 640700014175034010000000 D[CONST 1] ROT[14.] ALU[QORD] DEST[Q] NORM $ 16m0002 ;Q=ODD[LINE] LINE/2 000000 16m0002 11240 640700040175044060000000 VIDPT1: D[10 + WORD,,PIXEL3] ROT[18.] MASK[6] ALU[QORD] DEST[Q] NORM $ 16m0002 ;Q=ODD[LINE] LINE/2 WORD (=interlaced address) 16m0002 16m0002 11241 640700014035014070000000 D[CONST 7] ROT[6] ALU[Q+D] DEST[Q] NORM $ 16m0002 ;Q=ADR+7*64. 16m0002 11242 640702214435000063600000 D[CONST 6] ALU[Q+D] DEST[IOD] START-OUT NORM $ 16m0002 ;IOD=ADR+7 lines, 6 words 16m0002 16m0002 11243 240700004171000410020000 MAPF[2] D[MEM] MASK[33.] DEST[Q] C800 $ 16m0002 ;VLDADR Q=DATA 16m0002 D[10 + COLOR] ROT[2] MASK[2] 16m0002 11244 270040060571004020000000 COND[-OBUS=0] PUSHJ[VIDCOL] C800 $ 16m0002 ;If bit(s) 0 or 1 of color on, "color" the word 16m0002 11245 240702260735000443600000 D[10 + COLOR] ALU[D#Q] DEST[IOD] START-OUT C800 $ 16m0002 ;IOD=DATA XOR COLOR 16m0002 11246 240300000571000443410000 MAPF[1] START-IN POPJ C800 $ 16m0002 ;VLDDAT (next line must have MAPF[7] ... C800) 16m0002 16m0002 ;Make the contents of Q be a colored data word. 16m0002 ;If <2 make it 0, else make it 4. 16m0002 11247 640710000555000440000000 VIDCOL: ALU[Q] DEST[AR] NORM $ 16m0002 ;COPY Q 16m0002 11250 640700000175002440000000 D[AR] ROT[1] ALU[DORQ] DEST[Q] NORM $ 16m0002 ;The 4 bit in each pixel is 1 if either the 4 or 2 bits were 1. 16m0002 11251 640700014275000330000000 D[CONST 33] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 11252 640700014275014330000000 D[CONST 33] ROT[6] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 11253 640700014275030330000000 D[CONST 33] ROT[12.] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 11254 640700014275044330000000 D[CONST 33] ROT[18.] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 11255 640700014275060330000000 D[CONST 33] ROT[24.] ALU[-D&Q] DEST[Q] NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 11256 640300014275074730000000 D[CONST 73] ROT[30.] ALU[-D&Q] DEST[Q] POPJ NORM $ 16m0002 ;Zero the 2 and 1 bits. 16m0002 16m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 177 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 17m0002 ;Vector A-MEM: 17m0002 17m0002 0 PIXEL,,FRACT = 0 17m0002 1 INTEN,,FRACT = 1 17m0002 2 XMAX,,XMIN = 2 17m0002 3 YMAX,,YMIN = 3 17m0002 4 DXDY,,FRACT = 4 17m0002 5 A3DYDX,,FRACT = 5 17m0002 6 OFFSET,,LINE = 6 17m0002 7 POG,,POGB = 7 17m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 178 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 18m0002 ;Paint line left 18m0002 .DEFINE VIDLFT[] 18m0002 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 18m0002 ;Q=0,,LINE 18m0002 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 18m0002 ;OFFSET,,LINE=0,,LINE 18m0002 18m0002 PUSHJ[VIDDT1] NORM $ 18m0002 ;Do it 18m0002 18m0002 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 18m0002 ;Q=INTEN,,FRACT VWEVID 18m0002 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 18m0002 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 18m0002 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 18m0002 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 18m0002 D[CONST 4] ROT[15.] ALU[Q-D-1] 18m0002 COND[OBUS<0] JUMP[. + 9] C600 $ 18m0002 ;If INTEN,,FRACT-0,,377777<0, done. 18m0002 18m0002 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 18m0002 ;Q=OFFSET,,LINE 18m0002 D[CONST 1] ROT[18.] ALU[Q-D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 18m0002 ;OFFSET-1,,LINE 18m0002 18m0002 COND[-INTRPT] JUMP[. - 7] NORM $ 18m0002 ;Loop if no interrupt 18m0002 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 18m0002 VIDSAV[%VIDFOO] ; THE MACRO GETS ITS ARGUMENT. 18m0002 ;Interrupt 18m0002 ] 18m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 179 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 19m0002 ;Paint line right 19m0002 .DEFINE VIDRGT[] 19m0002 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 19m0002 ;Q=0,,LINE 19m0002 D[CONST 1] ROT[18.] ALU[QORD] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 19m0002 ;OFFSET,,LINE=1,,LINE 19m0002 19m0002 PUSHJ[VIDDT1] NORM $ 19m0002 ;Do it (loop to here) 19m0002 19m0002 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 19m0002 ;Q=INTEN,,FRACT VWEVID 19m0002 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 19m0002 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 19m0002 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 19m0002 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 19m0002 D[CONST 4] ROT[15.] ALU[Q-D-1] 19m0002 COND[OBUS<0] JUMP[. + 9] C600 $ 19m0002 ;If INTEN,,FRACT-0,,377777<0, done. 19m0002 19m0002 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 19m0002 ;Q=OFFSET,,LINE 19m0002 D[CONST 1] ROT[18.] ALU[Q+D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 19m0002 ;OFFSET+1,,LINE 19m0002 19m0002 COND[-INTRPT] JUMP[. - 7] NORM $ 19m0002 ;Loop if no interrupt 19m0002 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 19m0002 VIDSAV[%VIDFOO] ; THE MACRO GETS ITS ARGUMENT. 19m0002 ;Interrupt 19m0002 ] 19m0002 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 180 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 ;Vector Body 20m0002 ;Extract X field from vector word (extending sign). 20m0002 ;Shift right 1. 20m0002 11257 640710014531020010000000 VIDVCI: D[CONST 1] ROT[8.] ALU[D-1] DEST[AR] NORM $ 20m0002 ;AR=377 20m0002 11260 640700044171024120000000 D[10 + INTEN,,FRACT] ROT[10.] MASK[10.] DEST[Q] NORM $ 20m0002 ;Q=X 20m0002 D[CONST 1] ROT[9.] ALU[D&Q] 20m0002 11261 510140014635022010000000 COND[OBUS=0] JUMP[VIDVC1] C550 $ 20m0002 ;IF SIGN=1 20m0002 11262 640700000175024440000000 D[AR] ROT[10.] ALU[DORQ] DEST[Q] NORM $ 20m0002 ;Q=0,,776 X 20m0002 11263 640700400555000443000000 VIDVC1: ALU[Q] DEST[XMAX,,XMIN] DEST-A-MEM NORM $ 20m0002 ;XMAX,,XMIN=0,,X 20m0002 20m0002 ;Extract Y field from vector word (extending sign). Note the sign change. 20m0002 11264 640710044473052120000000 D[10 + INTEN,,FRACT] ROT[21.] MASK[10.] ALU[0-D] DEST[AR] NORM $ 20m0002 ;Q=-Y 20m0002 11265 640700000171000120000000 D[AR] MASK[10.] DEST[Q] NORM $ 20m0002 ;Q=-Y 20m0002 D[CONST 1] ROT[9.] ALU[D&Q] 20m0002 11266 510140014635022010000000 COND[OBUS=0] JUMP[VIDVC2] C550 $ 20m0002 ;IF SIGN=1 20m0002 11267 640710014531020010000000 D[CONST 1] ROT[8.] ALU[D-1] DEST[AR] NORM $ 20m0002 ;AR=377 20m0002 11270 640700000175024440000000 D[AR] ROT[10.] ALU[DORQ] DEST[Q] NORM $ 20m0002 ;Q=0,,776 Y 20m0002 11271 640700600555000443000000 VIDVC2: ALU[Q] DEST[YMAX,,YMIN] DEST-A-MEM NORM $ 20m0002 ;YMAX,,YMIN=0,,Y 20m0002 20m0002 ;Get default color (0=no change). 20m0002 D[10 + INTEN,,FRACT] ROT[25.] MASK[3] DEST[AR] 20m0002 11272 510150044571062030000000 COND[OBUS=0] JUMP[VIDVC3] C550 $ 20m0002 ;AR=BRT (color) if=0, no change 20m0002 11273 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11274 640720014435000600000000 D[CONST 48.] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+48. read LAST COLOR,,LAST FONT 20m0002 11275 640700000171102440020000 MAPF[NORM-RD] D[AR] ROT[33.] DEST[Q] NORM $ 20m0002 ;Q=COLOR 00000,,000000 20m0002 11276 640704204575000220000000 D[MEM] MASK[18.] ALU[DORQ] DEST[MEMSTO] NORM $ 20m0002 ;HOLD=COLOR 00000,,LAST FONT write LAST COLOR,,LAST FONT 20m0002 20m0002 ;Get default font (0=no change). 20m0002 VIDVC3: D[10 + INTEN,,FRACT] ROT[28.] MASK[3] 20m0002 11277 510140044571070030000000 COND[OBUS=0] JUMP[VIDVC4] C550 $ 20m0002 ;if SIZE(FONT)=0, no change 20m0002 11300 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11301 640720014035000600000000 D[CONST 48.] ALU[D+Q] DEST[Q MA] NORM $ 20m0002 ;Q,MA=POGB+48 read LAST COLOR,,LAST FONT 20m0002 11302 640700000571000440020000 MAPF[NORM-RD] NORM $ 20m0002 ;WAIT 20m0002 11303 640710004571000000200000 D[MEM] SPEC[LEFT] DEST[AR] NORM $ 20m0002 ;AR=COLOR,,0 20m0002 11304 640720044435070030000000 D[10 + INTEN,,FRACT] ROT[28.] MASK[3] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+48.+SIZE ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 181 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 11305 640700000171000440020000 MAPF[NORM-RD] D[AR] DEST[Q] NORM $ 20m0002 ;Q=COLOR,,0 20m0002 11306 640704404575000220000000 D[MEM] MASK[18.] ALU[DORQ] DEST[HOLD] NORM $ 20m0002 ;HOLD=COLOR,,FONT 20m0002 11307 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11310 640724014435000600000000 D[CONST 48.] ALU[D+Q] DEST[MA] STRT-WRT NORM $ 20m0002 ;Q,MA=POGB+48 write LAST COLOR,,LAST FONT 20m0002 20m0002 ;Check relative. 20m0002 VIDVC4: MAPF[NORM-RD] D[10 + INTEN,,FRACT] ROT[29.] 20m0002 11311 511140044571072440020000 COND[OBUS<0] JUMP[VIDVC5] C550 $ 20m0002 ;if relative 20m0002 20m0002 ;If relative, add previous X coordinate. 20m0002 11312 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11313 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+61. read X0,,X1 20m0002 11314 640700050171000440020000 MAPF[NORM-RD] D[10 + XMAX,,XMIN] DEST[Q] NORM $ 20m0002 ;Q=0,,X 20m0002 11315 640710004435000220000000 D[MEM] MASK[18.] ALU[D+Q] DEST[AR] NORM $ 20m0002 ;AR=0,,X+X1 20m0002 11316 640700004171044000200000 D[MEM] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=X1,,0 20m0002 11317 640704200575000220000000 D[AR] MASK[18.] ALU[DORQ] DEST[MEMSTO] NORM $ 20m0002 ;HOLD=X1,,X+X1 write X0,,X1 20m0002 20m0002 ;If relative, add previous Y coordinate. 20m0002 11320 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 20m0002 ;MA=POGB+62. read Y0,,Y1 20m0002 11321 640700054171000440020000 MAPF[NORM-RD] D[10 + YMAX,,YMIN] DEST[Q] NORM $ 20m0002 ;Q=0,,Y 20m0002 11322 640710004435000220000000 D[MEM] MASK[18.] ALU[D+Q] DEST[AR] NORM $ 20m0002 ;AR=0,,Y+Y1 20m0002 11323 640700004171044000200000 D[MEM] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=Y1,,0 20m0002 11324 640144200575000220000000 D[AR] MASK[18.] ALU[DORQ] DEST[MEMSTO] JUMP[VIDVC6] NORM $ 20m0002 ;HOLD=Y1,,Y+Y1 write Y0,,Y1 20m0002 20m0002 ;If absolute,just copy X 20m0002 11325 640700074171000220000000 VIDVC5: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11326 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+61. read X0,,X1 20m0002 11327 640700050171000440020000 MAPF[NORM-RD] D[10 + XMAX,,XMIN] DEST[Q] NORM $ 20m0002 ;Q=0,,X 20m0002 11330 640704204575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[MEMSTO] NORM $ 20m0002 ;HOLD=X1,,X write X0,,X1 20m0002 20m0002 ;If absolute, just copy Y 20m0002 11331 640720024433000440000000 D[MA] ALU[D+1] DEST[MA] NORM $ 20m0002 ;MA=POGB+62. read Y0,,Y1 20m0002 11332 640700054171000440020000 MAPF[NORM-RD] D[10 + YMAX,,YMIN] DEST[Q] NORM $ 20m0002 ;Q=0,,Y 20m0002 11333 640704204575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[MEMSTO] NORM $ 20m0002 ;HOLD=Y1,,Y write Y0,,Y1 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 182 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 20m0002 ;Check type code. If 0, visible vector. (For now, all others invisible.) 20m0002 VIDVC6: D[10 + INTEN,,FRACT] ROT[32.] MASK[2] 20m0002 11334 530140044571100020000673 COND[-OBUS=0] JUMP[VIDDON] C550 $ 20m0002 ;If T NEQ 0, done 20m0002 20m0002 ;Check first half done. 20m0002 D[10 + POG,,POGB] MASK[18.] DEST[Q] 20m0002 11335 656140074171000220000000 COND[HALF] JUMP[VIDVCH] NORM $ 20m0002 ;Q=POGB If -HALF 20m0002 20m0002 ;If first half not done, color=modified last color 77777,,777777 20m0002 11336 640720014435000600000000 D[CONST 48.] ALU[Q+D] DEST[MA] NORM $ 20m0002 ;MA=POGB+48. read LAST COLOR 20m0002 11337 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 20m0002 ;AR=077777,,777777 20m0002 11340 640700004171000440000000 D[MEM] DEST[Q] NORM $ 20m0002 ;Q=LAST COLOR,,LAST FONT 20m0002 D[MEM] ROT[2] MASK[2] 20m0002 11341 510140004571004020000000 COND[OBUS=0] JUMP[VIDVIM] C550 $ 20m0002 ;If color>1 20m0002 11342 640700014175102070000000 D[CONST 7] ROT[33.] ALU[DORQ] DEST[Q] NORM $ 20m0002 ;Q=COLOR 7 (WHITE FROM COLOR) 20m0002 VIDVIM: 20m0002 .REPEAT VIC2 [ 20m0002 D[AR] ALU[DORQ] DEST[IOD] START-OUT NORM $ 20m0002 ;IOD=MODIFIED LAST COLOR 77777,,777777 20m0002 ];VIC2 20m0002 .REPEAT 1 - VIC2 [ 20m0002 D[AR] ALU[DORQ] DEST[HOLD] NORM $ 20m0002 ;MEM=MODIFIED LAST COLOR 77777,,777777 20m0002 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 20m0002 ;MA=POGB+59 write 20m0002 MAPF[NORM-RD] JUMP[VIDVI0] NORM $ 20m0002 ;WAIT 20m0002 ];[ 20m0002 11343 640704400575000440000000 D[AR] ALU[DORQ] DEST[HOLD] NORM $ 20m0002 ;MEM=MODIFIED LAST COLOR 77777,,777777 20m0002 11344 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11345 640724014435000730000000 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 20m0002 ;MA=POGB+59 write 20m0002 11346 640140000571000440020000 MAPF[NORM-RD] JUMP[VIDVI0] NORM $ 20m0002 ;WAIT 20m0002 ]1-VIC2 20m0002 20m0002 ;If first half done, color=default color 00000,,000000 20m0002 11347 640720014435000600000000 VIDVCH: D[CONST 48.] ALU[Q+D] DEST[MA] NORM $ 20m0002 ;MA=POGB+48. read LAST COLOR 20m0002 11350 640710014531102010020000 MAPF[NORM-RD] D[CONST 1] ROT[33.] ALU[D-1] DEST[AR] NORM $ 20m0002 ;AR=077777,,777777 20m0002 11351 640700004171000440000000 D[MEM] DEST[Q] NORM $ 20m0002 ;Q=LAST COLOR,,LAST FONT 20m0002 .REPEAT VIC2 [ 20m0002 D[AR] ALU[-D&Q] DEST[IOD] START-OUT NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 183 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 ;IOD=LAST COLOR 00000,,000000 20m0002 ];VIC2 20m0002 .REPEAT 1 - VIC2 [ 20m0002 D[AR] ALU[-D&Q] DEST[HOLD] NORM $ 20m0002 ;MEM=LAST COLOR 00000,,000000 20m0002 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 20m0002 ;MA=POGB+59 write 20m0002 MAPF[NORM-RD] NORM $ 20m0002 ;WAIT 20m0002 ];[ 20m0002 11352 640704400675000440000000 D[AR] ALU[-D&Q] DEST[HOLD] NORM $ 20m0002 ;MEM=LAST COLOR 00000,,000000 20m0002 11353 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11354 640724014435000730000000 D[CONST 59.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 20m0002 ;MA=POGB+59 write 20m0002 11355 640700000571000440020000 MAPF[NORM-RD] NORM $ 20m0002 ;WAIT 20m0002 ]1-VIC2 20m0002 20m0002 ;Save X0,,X1 and form XMAX,,XMIN. 20m0002 11356 240700074171000440100000 VIDVI0: MAPF[10] D[10 + POG,,POGB] DEST[Q] C800 $ 20m0002 ;VLDCOL Q=POGB 20m0002 11357 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+61. read X0,,X1 20m0002 11360 640700000571000440020000 MAPF[NORM-RD] NORM $ 20m0002 ;WAIT FOR MEM 20m0002 11361 640700404171000443000000 D[MEM] DEST[Q XMAX,,XMIN] DEST-A-MEM NORM $ 20m0002 ;Q,XMAX,,XMIN=X0,,X1 20m0002 11362 640701004571000443000000 D[MEM] DEST[DXDY,,FRACT] DEST-A-MEM NORM $ 20m0002 ;DXDY,,FRACT=X0,,X1 (for use below) 20m0002 D[MEM] ROT[18.] ALU[Q-D] 20m0002 11363 471140004477044440000000 COND[-OBUS<0] JUMP[VIDVI1] C600 $ 20m0002 ;If X0,,X1-X1,,X0<0 20m0002 11364 640700404571044443000000 D[MEM] ROT[18.] DEST[XMAX,,XMIN] DEST-A-MEM NORM $ 20m0002 ;XMAX,,XMIN=X1,,X0 20m0002 20m0002 ;Save Y0,,Y1 and form YMAX,,YMIN. 20m0002 11365 640700074171000440000000 VIDVI1: D[10 + POG,,POGB] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11366 640720014435000760000000 D[CONST 62.] ALU[D+Q] DEST[MA] NORM $ 20m0002 ;MA=POGB+62. read Y0,,Y1 20m0002 11367 640700000571000440020000 MAPF[NORM-RD] NORM $ 20m0002 ;WAIT FOR MEM 20m0002 11370 640700604171000443000000 D[MEM] DEST[Q YMAX,,YMIN] DEST-A-MEM NORM $ 20m0002 ;Q,YMAX,,YMIN=Y0,,Y1 20m0002 11371 640701204571000443000000 D[MEM] DEST[A3DYDX,,FRACT] DEST-A-MEM NORM $ 20m0002 ;A3DYDX,,FRACT=Y0,,Y1 (for use below) 20m0002 D[MEM] ROT[18.] ALU[Q-D] 20m0002 11372 471140004477044440000000 COND[-OBUS<0] JUMP[VIDVI2] C600 $ 20m0002 ;If Y0,,Y1-Y1,,Y0<0 20m0002 11373 640700604571044443000000 D[MEM] ROT[18.] DEST[YMAX,,YMIN] DEST-A-MEM NORM $ 20m0002 ;YMAX,,YMIN=Y1,,Y0 20m0002 20m0002 ;Form delta X. Check for vertical vectors. ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 184 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 11374 640700060171044000200000 VIDVI2: D[10 + DXDY,,FRACT] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=X1,,0 20m0002 11375 640700060077000000200000 D[10 + DXDY,,FRACT] SPEC[LEFT] ALU[Q-D] DEST[Q] NORM $ 20m0002 ;Q=DX,,0=X1,,0-X0,,0 20m0002 ALU[Q] DEST[DXDY,,FRACT] DEST-A-MEM 20m0002 11376 510141000555000443000000 COND[OBUS=0] JUMP[VIDVRV] C550 $ 20m0002 ;DXDY,,FRACT=DX,,0 (for use below) 20m0002 ;If DX=0, vertical vector 20m0002 20m0002 ;Form delta Y. Check for horizontal vectors. 20m0002 11377 640700064171044000200000 D[10 + A3DYDX,,FRACT] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=Y1,,0 20m0002 11400 640700064077000000200000 D[10 + A3DYDX,,FRACT] SPEC[LEFT] ALU[Q-D] DEST[Q] NORM $ 20m0002 ;Q=DY,,0=Y1,,0-Y0,,0 20m0002 ALU[Q] DEST[A3DYDX,,FRACT] DEST-A-MEM 20m0002 11401 510141200555000443000000 COND[OBUS=0] JUMP[VIDHZV] C550 $ 20m0002 ;A3DYDX,,FRACT=DY,,0 (for use below) 20m0002 ;If DY=0, horizontal vector 20m0002 20m0002 ;Form DXDY and A3DYDX. 20m0002 11402 640710060571000440000000 D[10 + DXDY,,FRACT] DEST[AR] NORM $ 20m0002 ;AR=DIVIDEND=DX,,0 20m0002 11403 640044464571000440000000 D[10 + A3DYDX,,FRACT] DEST[HOLD] PUSHJ[VIDDIV] NORM $ 20m0002 ;HOLD=DIVISOR=DY,,0 divide 20m0002 11404 640710000555000440000000 ALU[Q] DEST[AR] NORM $ 20m0002 ;AR=DX/DY,,FRACT (abs val) 20m0002 11405 640700060171000440000000 D[10 + DXDY,,FRACT] DEST[Q] NORM $ 20m0002 ;Q=DX 20m0002 D[10 + A3DYDX,,FRACT] ALU[D#Q] 20m0002 11406 531140064735000440000000 COND[-OBUS<0] JUMP[VIDVI3] C550 $ 20m0002 ;IF DX XOR DY < 0 20m0002 11407 640710000473000440000000 D[AR] ALU[0-D] DEST[AR] NORM $ 20m0002 ;AR=-DX/DY (correct sign) 20m0002 11410 640704460571000440000000 VIDVI3: D[10 + DXDY,,FRACT] DEST[HOLD] NORM $ 20m0002 ;HOLD=DIVISOR=DX 20m0002 11411 640701000571000443000000 D[AR] DEST[DXDY,,FRACT] DEST-A-MEM NORM $ 20m0002 ;DXDY,,FRACT=DX/DY,,FRACT 20m0002 11412 640050064571000440000000 D[10 + A3DYDX,,FRACT] DEST[AR] PUSHJ[VIDDIV] NORM $ 20m0002 ;AR=DIVIDEND=DY divide 20m0002 11413 640710000555000440000000 ALU[Q] DEST[AR] NORM $ 20m0002 ;AR=DY/DX,,FRACT (abs val) 20m0002 11414 640701200435002443000000 D[AR] ROT[1] ALU[Q+D] DEST[A3DYDX,,FRACT] DEST-A-MEM NORM $ 20m0002 ;A3DYDX=3*ABS[DY/DX] 20m0002 20m0002 ;Initialize OFFSET,,LINE. 20m0002 11415 640700054171000220000000 D[10 + YMAX,,YMIN] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=0,,YMIN 20m0002 11416 640701400555000443000000 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0002 ;OFFSET,,LINE=0,,YMIN 20m0002 20m0002 ;Initialize PIXEL,,FRACT and form boundary limits from POG windows. 20m0002 11417 640700050171044000200000 D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=XMIN,,0 20m0002 D[10 + DXDY,,FRACT] 20m0002 11420 531140060571000440000000 COND[-OBUS<0] JUMP[VIDVI4] C550 $ 20m0002 ;If slope negative 20m0002 11421 640700050171000000200000 D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 185 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 20m0002 ;Q=XMAX,,0 20m0002 11422 640040000555000443000000 VIDVI4: ALU[Q] DEST[PIXEL,,FRACT] DEST-A-MEM PUSHJ[VIDVLM] NORM $ 20m0002 ;PIXEL,,FRACT=Q form boundary limits 20m0002 20m0002 ;Check to see what side of 45 degrees vector's slope is. 20m0002 11423 640700064171000440000000 D[10 + A3DYDX,,FRACT] DEST[Q] NORM $ 20m0002 ;Q=A3DYDX,,FRACT 20m0002 D[CONST 3] ROT[18.] ALU[Q-D] 20m0002 11424 451140014477044030000000 COND[OBUS<0] JUMP[VIDLL2] C600 $ 20m0002 ;If A3DYDX,,FRACT-3,,0<0, other case 20m0002 20m0002 ;This is the loop for painting 1 line of vectors whose slope is between 20m0002 ;45 degrees (inclusive) and vertical (exclusive). 20m0002 20m0002 ;Check for above window. 20m0002 11425 640700054171044000200000 VIDLL1: D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0002 ;Q=YMIN,,0 20m0002 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] ALU[D-Q] 20m0002 11426 451140070537044000200000 COND[OBUS<0] JUMP[VIDSL1] C600 $ 20m0002 ;If LINE,,0-YMIN,,0<0, skip line 20m0002 ;Paint left. 20m0002 11427 640700040171000220000000 D[10 + PIXEL,,FRACT] MASK[18.] ALU[D] DEST[Q] NORM $ 20m0002 ;Q=0,,FRACT(PIXEL) 20m0002 11430 640710014137044010000000 D[CONST 1] ROT[18.] ALU[D-Q] DEST[Q AR] NORM $ 20m0002 ;Q,AR=1,,0-0,,FRACT(PIXEL) 20m0002 11431 640700200435002443000000 D[AR] ROT[1] ALU[D+Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0002 ;INTEN,,FRACT=3*(1,,0-0,,FRACT(PIXEL)) 20m0002 20m0002 VIDLFT 20m0002 20m0002 11432 640700070171000220000000 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=0,,LINE 20m0002 11433 640701400555000443000000 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0002 ;OFFSET,,LINE=0,,LINE 20m0002 20m0002 11434 640040000571000440000000 PUSHJ[VIDDT1] NORM $ 20m0002 ;Do it 20m0002 20m0002 11435 240700044171000440070000 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 20m0002 ;Q=INTEN,,FRACT VWEVID 20m0002 11436 640700064077000440000000 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 20m0002 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 20m0002 11437 640700200555000443000000 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0002 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 20m0002 D[CONST 4] ROT[15.] ALU[Q-D-1] 20m0002 11440 451140014475036040001451 COND[OBUS<0] JUMP[. + 9] C600 $ 20m0002 ;If INTEN,,FRACT-0,,377777<0, done. 20m0002 20m0002 11441 640700070171000440000000 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 20m0002 ;Q=OFFSET,,LINE 20m0002 11442 640701414477044013000000 D[CONST 1] ROT[18.] ALU[Q-D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0002 ;OFFSET-1,,LINE 20m0002 20m0002 11443 661140000571000440001434 COND[-INTRPT] JUMP[. - 7] NORM $ 20m0002 ;Loop if no interrupt 20m0002 11434 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 20m0002 VIDSAV[%VIDFOO] ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 186 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 20m0002 11444 640700014171030010000000 [ D[CONST (%VIDFOO / 10000)] ROT[12.] DEST[Q] NORM $ 20m0002 ;Q=high bit (SDISP loads all 16 bits) 20m0002 11445 640700014175014140000000 D[CONST (77 & (%VIDFOO / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 20m0002 ;Q=next 6 ADR bits 20m0002 11446 640704414575000340000000 D[CONST (%VIDFOO \ 100)] ALU[QORD] DEST[HOLD] NORM $ 20m0002 ;Q=SAVE ADR 20m0002 11447 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0002 ;Q=POGB 20m0002 11450 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 20m0002 ;MA=POGB+58 write SAVE ADR 20m0002 ] ; THE MACRO GETS ITS ARGUMENT. 20m0002 ;Interrupt 20m0003 ] 20m0003 ;Paint right. 20m0003 11451 640710040171000220000000 D[10 + PIXEL,,FRACT] MASK[18.] DEST[Q AR] NORM $ 20m0003 ;Q=0,,FRACT(PIXEL) 20m0003 11452 640700200435002443000000 D[AR] ROT[1] ALU[D+Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0003 ;INTEN,,FRACT=3*0,,FRACT(PIXEL) 20m0003 20m0003 VIDRGT 20m0003 20m0003 11453 640700070171000220000000 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0003 ;Q=0,,LINE 20m0003 11454 640701414575044013000000 D[CONST 1] ROT[18.] ALU[QORD] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0003 ;OFFSET,,LINE=1,,LINE 20m0003 20m0003 11455 640040000571000440000000 PUSHJ[VIDDT1] NORM $ 20m0003 ;Do it (loop to here) 20m0003 20m0003 11456 240700044171000440070000 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 20m0003 ;Q=INTEN,,FRACT VWEVID 20m0003 11457 640700064077000440000000 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 20m0003 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 20m0003 11460 640700200555000443000000 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0003 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 20m0003 D[CONST 4] ROT[15.] ALU[Q-D-1] 20m0003 11461 451140014475036040001472 COND[OBUS<0] JUMP[. + 9] C600 $ 20m0003 ;If INTEN,,FRACT-0,,377777<0, done. 20m0003 20m0003 11462 640700070171000440000000 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 20m0003 ;Q=OFFSET,,LINE 20m0003 11463 640701414435044013000000 D[CONST 1] ROT[18.] ALU[Q+D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0003 ;OFFSET+1,,LINE 20m0003 20m0003 11464 661140000571000440001455 COND[-INTRPT] JUMP[. - 7] NORM $ 20m0003 ;Loop if no interrupt 20m0003 11455 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 20m0003 VIDSAV[%VIDFOO] 20m0003 11465 640700014171030010000000 [ D[CONST (%VIDFOO / 10000)] ROT[12.] DEST[Q] NORM $ 20m0003 ;Q=high bit (SDISP loads all 16 bits) 20m0003 11466 640700014175014140000000 D[CONST (77 & (%VIDFOO / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 20m0003 ;Q=next 6 ADR bits 20m0003 11467 640704414575000550000000 D[CONST (%VIDFOO \ 100)] ALU[QORD] DEST[HOLD] NORM $ 20m0003 ;Q=SAVE ADR 20m0003 11470 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0003 ;Q=POGB 20m0003 11471 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 187 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 20m0003 ;MA=POGB+58 write SAVE ADR 20m0003 ] ; THE MACRO GETS ITS ARGUMENT. 20m0003 ;Interrupt 20m0004 ] 20m0004 ;Reset offset and increment line. 20m0004 11472 640700070171000220000000 VIDSL1: D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0004 ;Q=0,,LINE 20m0004 11473 640701400417000443000000 ALU[Q+1] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0004 ;OFFSET,,LINE=0,,LINE+1 20m0004 20m0004 ;Check for below window. 20m0004 11474 640700070171044000200000 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0004 ;Q=LINE,,0 20m0004 D[10 + YMAX,,YMIN] SPEC[LEFT] ALU[D-Q] 20m0004 11475 451140054537000000200000 COND[OBUS<0] JUMP[VIDVEN] C600 $ 20m0004 ;If YMAX,,0-LINE,,0<0, terminate 20m0004 20m0004 ;Increment X position. 20m0004 11476 640700040171000440000000 D[10 + PIXEL,,FRACT] DEST[Q] NORM $ 20m0004 ;Q=PIXEL,,FRACT 20m0004 11477 640700060035000440000000 D[10 + DXDY,,FRACT] ALU[Q+D] DEST[Q] NORM $ 20m0004 ;Q=PIXEL,,FRACT+DXDY,,FRACT 20m0004 11500 640140000555000443001425 ALU[Q] DEST[PIXEL,,FRACT] DEST-A-MEM JUMP[VIDLL1] NORM $ 20m0004 ;PIXEL,,FRACT=PIXEL,,FRACT+DXDY,,FRACT loop 20m0004 20m0004 ;This is the loop for vectors whose slope is between 45 degrees (exclusive) 20m0004 ;and horizontal (exclusive). 20m0004 20m0004 ;Check for above window. 20m0004 11501 640700054171044000200000 VIDLL2: D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0004 ;Q=YMIN,,0 20m0004 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] ALU[D-Q] 20m0004 11502 451140070537044000200000 COND[OBUS<0] JUMP[VIDSL2] C600 $ 20m0004 ;If LINE,,0-YMIN,,0<0, skip line 20m0004 20m0004 ;Paint left. 20m0004 D[10 + PIXEL,,FRACT] ROT[36. - 2] MASK[16.] DEST[Q] 20m0004 11503 640040040171104200000000 PUSHJ[VIDMUL] NORM $ 20m0004 ;Q=MULTIPLIER(0,,00 16 BIT) multiply 20m0004 11504 640700214537044033000000 D[CONST 3] ROT[18.] ALU[D-Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0004 ;INTEN,,FRACT=3,,0-0,,DELTA*A3DYDX,,FRACT 20m0004 20m0004 VIDLFT 20m0004 20m0004 11505 640700070171000220000000 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0004 ;Q=0,,LINE 20m0004 11506 640701400555000443000000 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0004 ;OFFSET,,LINE=0,,LINE 20m0004 20m0004 11507 640040000571000440000000 PUSHJ[VIDDT1] NORM $ 20m0004 ;Do it 20m0004 20m0004 11510 240700044171000440070000 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 20m0004 ;Q=INTEN,,FRACT VWEVID 20m0004 11511 640700064077000440000000 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 20m0004 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 20m0004 11512 640700200555000443000000 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 188 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 20m0004 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 20m0004 D[CONST 4] ROT[15.] ALU[Q-D-1] 20m0004 11513 451140014475036040001524 COND[OBUS<0] JUMP[. + 9] C600 $ 20m0004 ;If INTEN,,FRACT-0,,377777<0, done. 20m0004 20m0004 11514 640700070171000440000000 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 20m0004 ;Q=OFFSET,,LINE 20m0004 11515 640701414477044013000000 D[CONST 1] ROT[18.] ALU[Q-D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0004 ;OFFSET-1,,LINE 20m0004 20m0004 11516 661140000571000440001507 COND[-INTRPT] JUMP[. - 7] NORM $ 20m0004 ;Loop if no interrupt 20m0004 11507 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 20m0004 VIDSAV[%VIDFOO] 20m0004 11517 640700014171030010000000 [ D[CONST (%VIDFOO / 10000)] ROT[12.] DEST[Q] NORM $ 20m0004 ;Q=high bit (SDISP loads all 16 bits) 20m0004 11520 640700014175014150000000 D[CONST (77 & (%VIDFOO / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 20m0004 ;Q=next 6 ADR bits 20m0004 11521 640704414575000070000000 D[CONST (%VIDFOO \ 100)] ALU[QORD] DEST[HOLD] NORM $ 20m0004 ;Q=SAVE ADR 20m0004 11522 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0004 ;Q=POGB 20m0004 11523 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 20m0004 ;MA=POGB+58 write SAVE ADR 20m0004 ] ; THE MACRO GETS ITS ARGUMENT. 20m0004 ;Interrupt 20m0005 ] 20m0005 ;Paint right. 20m0005 11524 640700040171104200000000 D[10 + PIXEL,,FRACT] ROT[36. - 2] MASK[16.] DEST[Q] NORM $ 20m0005 ;Q=MULTIPLIER(0,,00 16 BIT) 20m0005 11525 640040014135040010000000 D[CONST 1] ROT[16.] ALU[D-Q-1] DEST[Q] PUSHJ[VIDMUL] NORM $ 20m0005 ;Q=1-MULTIPLIER (0,,177777-16 BIT) multiply 20m0005 11526 640700214537044033000000 D[CONST 3] ROT[18.] ALU[D-Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0005 ;INTEN,,FRACT=3,,0-0,,DELTA*A3DYDX,,FRACT 20m0005 20m0005 VIDRGT 20m0005 20m0005 11527 640700070171000220000000 [ D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0005 ;Q=0,,LINE 20m0005 11530 640701414575044013000000 D[CONST 1] ROT[18.] ALU[QORD] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0005 ;OFFSET,,LINE=1,,LINE 20m0005 20m0005 11531 640040000571000440000000 PUSHJ[VIDDT1] NORM $ 20m0005 ;Do it (loop to here) 20m0005 20m0005 11532 240700044171000440070000 MAPF[7] D[10 + INTEN,,FRACT] DEST[Q] C800 $ 20m0005 ;Q=INTEN,,FRACT VWEVID 20m0005 11533 640700064077000440000000 D[10 + A3DYDX,,FRACT] ALU[Q-D] DEST[Q] NORM $ 20m0005 ;Q=INTEN,,FRACT-A3DYDX,,FRACT 20m0005 11534 640700200555000443000000 ALU[Q] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 20m0005 ;AMEM[1]=INTEN,,FRACT-A3DYDX,,FRACT 20m0005 D[CONST 4] ROT[15.] ALU[Q-D-1] 20m0005 11535 451140014475036040001546 COND[OBUS<0] JUMP[. + 9] C600 $ 20m0005 ;If INTEN,,FRACT-0,,377777<0, done. 20m0005 20m0005 11536 640700070171000440000000 D[10 + OFFSET,,LINE] DEST[Q] NORM $ 20m0005 ;Q=OFFSET,,LINE ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 189 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 20m0005 11537 640701414435044013000000 D[CONST 1] ROT[18.] ALU[Q+D] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0005 ;OFFSET+1,,LINE 20m0005 20m0005 11540 661140000571000440001531 COND[-INTRPT] JUMP[. - 7] NORM $ 20m0005 ;Loop if no interrupt 20m0005 11531 %VIDFOO = (. - 8) ;NOTE: THIS FORCES EVALUATION BEFORE 20m0005 VIDSAV[%VIDFOO] 20m0005 11541 640700014171030010000000 [ D[CONST (%VIDFOO / 10000)] ROT[12.] DEST[Q] NORM $ 20m0005 ;Q=high bit (SDISP loads all 16 bits) 20m0005 11542 640700014175014150000000 D[CONST (77 & (%VIDFOO / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 20m0005 ;Q=next 6 ADR bits 20m0005 11543 640704414575000310000000 D[CONST (%VIDFOO \ 100)] ALU[QORD] DEST[HOLD] NORM $ 20m0005 ;Q=SAVE ADR 20m0005 11544 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 20m0005 ;Q=POGB 20m0005 11545 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 20m0005 ;MA=POGB+58 write SAVE ADR 20m0005 ] ; THE MACRO GETS ITS ARGUMENT. 20m0005 ;Interrupt 20m0006 ] 20m0006 ;Increment line and reset offset. 20m0006 11546 640700070171000220000000 VIDSL2: D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 20m0006 ;Q=0,,LINE 20m0006 11547 640701400417000443000000 ALU[Q+1] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 20m0006 ;OFFSET,,LINE=0,,LINE+1 20m0006 20m0006 ;Check for below window. 20m0006 11550 640700070171044000200000 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 20m0006 ;Q=LINE,,0 20m0006 D[10 + YMAX,,YMIN] SPEC[LEFT] ALU[D-Q] 20m0006 11551 451140054537000000200000 COND[OBUS<0] JUMP[VIDVEN] C600 $ 20m0006 ;If YMAX,,0-LINE,,0<0, terminate 20m0006 20m0006 ;Increment X position. 20m0006 11552 640700040171000440000000 D[10 + PIXEL,,FRACT] DEST[Q] NORM $ 20m0006 ;Q=PIXEL,,FRACT 20m0006 11553 640700060035000440000000 D[10 + DXDY,,FRACT] ALU[Q+D] DEST[Q] NORM $ 20m0006 ;Q=PIXEL,,FRACT+DXDY,,FRACT 20m0006 11554 640140000555000443001501 ALU[Q] DEST[PIXEL,,FRACT] DEST-A-MEM JUMP[VIDLL2] NORM $ 20m0006 ;PIXEL,,FRACT=PIXEL,,FRACT+DXDY,,FRACT loop 20m0006 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 190 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 21m0006 ;Vertical Vectors 21m0006 11555 640040000571000440000000 VIDVRV: PUSHJ[VIDVLM] NORM $ 21m0006 ;Form boundary limits 21m0006 21m0006 11556 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 21m0006 ;Q=POGB 21m0006 11557 640720014435000750000000 D[CONST 61.] ALU[D+Q] DEST[MA] NORM $ 21m0006 ;MA=POGB+61. read X0,,X1 21m0006 11560 640710050171044000220000 MAPF[NORM-RD] D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] DEST[Q AR] NORM $ 21m0006 ;Q,AR=XMIN,,0 (AR for use below) 21m0006 D[MEM] SPEC[LEFT] ALU[D-Q] 21m0006 11561 451140004537000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 21m0006 ;If X0,,0-XMIN,,0<0, main loop 21m0006 11562 640700050171000000200000 D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ 21m0006 ;Q=XMAX,,0 21m0006 D[MEM] SPEC[LEFT] ALU[Q-D] 21m0006 11563 451140004477000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 21m0006 ;If XMAX,,0-X0,,0<0, main loop 21m0006 21m0006 11564 640700000571000443000000 D[AR] DEST[PIXEL,,FRACT] DEST-A-MEM NORM $ 21m0006 ;PIXEL,,FRACT=XMIN,,0 21m0006 11565 640700054171000220000000 D[10 + YMAX,,YMIN] MASK[18.] DEST[Q] NORM $ 21m0006 ;Q=0,,YMIN 21m0006 11566 640701400555000443000000 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 21m0006 ;OFFSET,,LINE=0,,YMIN 21m0006 11567 640700214571044033000000 D[CONST 3] ROT[18.] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 21m0006 ;INTEN,,FRACT=3,,0 21m0006 21m0006 11570 640700054171000000200000 VIDVRL: D[10 + YMAX,,YMIN] SPEC[LEFT] DEST[Q] NORM $ 21m0006 ;Q=YMAX,,0 21m0006 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] ALU[Q-D] 21m0006 11571 451140070477044000200000 COND[OBUS<0] JUMP[VIDVEN] C600 $ 21m0006 ;If YMAX,,0-LINE,,0<0 terminate 21m0006 21m0006 11572 640040000571000440000000 PUSHJ[VIDDOT] NORM $ 21m0006 ;Do one pixel 21m0006 21m0006 11573 240700070171000220070000 MAPF[7] D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] C800 $ 21m0006 ;Q=0,,LINE VWEVID 21m0006 ALU[Q+1] DEST[OFFSET,,LINE] DEST-A-MEM 21m0006 11574 661141400417000443001570 COND[-INTRPT] JUMP[VIDVRL] NORM $ 21m0006 ;OFFSET,,LINE=0,,LINE+1 loop if no interrupt 21m0006 VIDSAV[VIDVRL] 21m0006 21m0006 11575 640700014171030010000000 [ D[CONST (VIDVRL / 10000)] ROT[12.] DEST[Q] NORM $ 21m0006 ;Q=high bit (SDISP loads all 16 bits) 21m0006 11576 640700014175014150000000 D[CONST (77 & (VIDVRL / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 21m0006 ;Q=next 6 ADR bits 21m0006 11577 640704414575000700000000 D[CONST (VIDVRL \ 100)] ALU[QORD] DEST[HOLD] NORM $ 21m0006 ;Q=SAVE ADR 21m0006 11600 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 21m0006 ;Q=POGB 21m0006 11601 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 21m0006 ;MA=POGB+58 write SAVE ADR 21m0007 ] ;Interrupt 21m0007 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 191 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 22m0007 ;Horizontal Vectors 22m0007 11602 640040000571000440000000 VIDHZV: PUSHJ[VIDVLM] NORM $ 22m0007 ;Form boundary limits 22m0007 22m0007 11603 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 22m0007 ;Q=POGB 22m0007 11604 640720014435000760000000 D[CONST 62.] ALU[D+Q] DEST[MA] NORM $ 22m0007 ;MA=POGB+62. read Y0,,Y1 22m0007 11605 640710054171044000220000 MAPF[NORM-RD] D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] DEST[Q AR] NORM $ 22m0007 ;Q,AR=YMIN,,0 (AR for use below) 22m0007 D[MEM] SPEC[LEFT] ALU[D-Q] 22m0007 11606 451140004537000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 22m0007 ;IF Y0,,0-YMIN,,0<0, main loop 22m0007 11607 640700054171000000200000 D[10 + YMAX,,YMIN] SPEC[LEFT] DEST[Q] NORM $ 22m0007 ;Q=YMAX,,0 22m0007 D[MEM] SPEC[LEFT] ALU[Q-D] 22m0007 11610 451140004477000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 22m0007 ;IF YMAX,,0-Y0,,0<0, main loop 22m0007 22m0007 11611 640701400571044443000000 D[AR] ROT[18.] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 22m0007 ;OFFSET,,LINE=0,,YMIN 22m0007 11612 640700050171044000200000 D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 22m0007 ;Q=XMIN,,0 22m0007 11613 640700000555000443000000 ALU[Q] DEST[PIXEL,,FRACT] DEST-A-MEM NORM $ 22m0007 ;PIXEL,,FRACT=XMIN,,0 22m0007 11614 640700214571044033000000 D[CONST 3] ROT[18.] DEST[INTEN,,FRACT] DEST-A-MEM NORM $ 22m0007 ;INTEN,,FRACT=3,,0 22m0007 22m0007 11615 640700050171000000200000 VIDHZL: D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ 22m0007 ;Q=XMAX,,0 22m0007 D[10 + PIXEL,,FRACT] SPEC[LEFT] ALU[Q-D] 22m0007 11616 451140040477000000200000 COND[OBUS<0] JUMP[VIDVEN] C600 $ 22m0007 ;If XMAX,,0-PIXEL,,0<0, terminate 22m0007 22m0007 11617 640040000571000440000000 PUSHJ[VIDDOT] NORM $ 22m0007 ;Do one pixel 22m0007 22m0007 11620 240700040171000440070000 MAPF[7] D[10 + PIXEL,,FRACT] DEST[Q] C800 $ 22m0007 ;Q=PIXEL,,FRACT VWEVID 22m0007 D[CONST 1] ROT[18.] ALU[Q+D] DEST[PIXEL,,FRACT] DEST-A-MEM 22m0007 11621 661140014435044013001615 COND[-INTRPT] JUMP[VIDHZL] NORM $ 22m0007 ;PIXEL,,FRACT=PIXEL+1,,FRACT loop if no interrupt 22m0007 VIDSAV[VIDHZL] 22m0007 22m0007 11622 640700014171030010000000 [ D[CONST (VIDHZL / 10000)] ROT[12.] DEST[Q] NORM $ 22m0007 ;Q=high bit (SDISP loads all 16 bits) 22m0007 11623 640700014175014160000000 D[CONST (77 & (VIDHZL / 100))] ROT[6] ALU[QORD] DEST[Q] NORM $ 22m0007 ;Q=next 6 ADR bits 22m0007 11624 640704414575000150000000 D[CONST (VIDHZL \ 100)] ALU[QORD] DEST[HOLD] NORM $ 22m0007 ;Q=SAVE ADR 22m0007 11625 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 22m0007 ;Q=POGB 22m0007 11626 640164014435000720000710 D[CONST 58.] ALU[Q+D] DEST[MA] STRT-WRT JUMP[VIDINT] NORM $ 22m0007 ;MA=POGB+58 write SAVE ADR 22m0008 ] ;Interrupt 22m0008 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 192 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 23m0008 ;Vector endpoint cleanup (subtract away first point if visible) 23m0008 11627 640700074171000220000000 VIDVEN: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 23m0008 ;Q=POGB 23m0008 11630 640720014435000760000000 D[CONST 62.] ALU[Q+D] DEST[MA] NORM $ 23m0008 ;MA=POGB+62. read Y0,,Y1 23m0008 11631 640700054171044000220000 MAPF[NORM-RD] D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 23m0008 ;Q=YMIN,,0 23m0008 D[MEM] SPEC[LEFT] ALU[D-Q] 23m0008 11632 451140004537000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 23m0008 ;If Y0,,0-YMIN,,0<0, main loop 23m0008 11633 640700054171000000200000 D[10 + YMAX,,YMIN] SPEC[LEFT] DEST[Q] NORM $ 23m0008 ;Q=YMAX,,0 23m0008 D[MEM] SPEC[LEFT] ALU[Q-D] 23m0008 11634 451140004477000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 23m0008 ;If YMAX,,0-Y0,,0<0, main loop 23m0008 11635 640710004571000000200000 D[MEM] SPEC[LEFT] DEST[AR] NORM $ 23m0008 ;AR=Y0,,0 (for use below) 23m0008 23m0008 11636 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 23m0008 ;Q=POGB 23m0008 11637 640720014435000750000000 D[CONST 61.] ALU[Q+D] DEST[MA] NORM $ 23m0008 ;MA=POGB+62. read X0,,X1 23m0008 11640 640700050171044000220000 MAPF[NORM-RD] D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 23m0008 ;Q=XMIN,,0 23m0008 D[MEM] SPEC[LEFT] ALU[D-Q] 23m0008 11641 451140004537000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 23m0008 ;If X0,,0-XMIN,,0<0, main loop 23m0008 11642 640700050171000000200000 D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ 23m0008 ;Q=XMAX,,0 23m0008 D[MEM] SPEC[LEFT] ALU[Q-D] 23m0008 11643 451140004477000000200673 COND[OBUS<0] JUMP[VIDDON] C600 $ 23m0008 ;If XMAX,,0-X0,,0<0, main loop 23m0008 23m0008 11644 640700004171000000200000 D[MEM] SPEC[LEFT] DEST[Q] NORM $ 23m0008 ;Q=X0,,0 23m0008 11645 640700000555000443000000 ALU[Q] DEST[PIXEL,,FRACT] DEST-A-MEM NORM $ 23m0008 ;PIXEL,,FRACT=X0,,0 23m0008 11646 640701400571044223000000 D[AR] ROT[18.] MASK[18.] DEST[OFFSET,,LINE] DEST-A-MEM NORM $ 23m0008 ;OFFSET,,LINE=0,,Y0 23m0008 11647 640040214571044053000000 D[CONST 5] ROT[18.] DEST[INTEN,,FRACT] DEST-A-MEM PUSHJ[VIDDOT] NORM $ 23m0008 ;INTEN,,FRACT=5,,0 Do it 23m0008 11650 240140000571000440070673 MAPF[7] JUMP[VIDDON] C800 $ 23m0008 ;VWEVID main loop 23m0008 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 193 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 24m0008 ;Output one pixel 24m0008 11651 640700070171000220000000 VIDDOT: D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=0,,LINE 24m0008 11652 640141400555000443000000 ALU[Q] DEST[OFFSET,,LINE] DEST-A-MEM JUMP[VIDDT2] NORM $ 24m0008 ;OFFSET,,LINE=0,,LINE 24m0008 24m0008 ;Enter here for limit check 24m0008 11653 640700040171000000200000 VIDDT1: D[10 + PIXEL,,FRACT] SPEC[LEFT] DEST[Q] NORM $ 24m0008 ;Q=PIXEL,,0 24m0008 11654 640710070035000000200000 D[10 + OFFSET,,LINE] SPEC[LEFT] ALU[Q+D] DEST[Q AR] NORM $ 24m0008 ;AR,Q=PIXEL,,0+OFFSET,,0 24m0008 D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] ALU[Q-D] 24m0008 11655 451300050477044000200000 COND[OBUS<0] POPJ C600 $ 24m0008 ;IF PIXEL,,0-XMIN,,0<0, RETURN 24m0008 D[10 + XMAX,,XMIN] SPEC[LEFT] ALU[D-Q] 24m0008 11656 451300050537000000200000 COND[OBUS<0] POPJ C600 $ 24m0008 ;IF XMAX,,0-PIXEL,,0<0, RETURN 24m0008 .REPEAT VIC2 [ 24m0008 VIDDT2: D[AR] ROT[18.] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=0,,PIXEL 24m0008 D[10 + OFFSET,,LINE] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[Q] NORM $ 24m0008 ;Q=LINE,,PIXEL 24m0008 D[10 + INTEN,,FRACT] ROT[18.] MASK[3] DEST[AR] NORM $ 24m0008 ;AR=0,,INTEN 24m0008 D[AR] ROT[33.] ALU[QORD] DEST[IOD] START-OUT NORM $ 24m0008 ;IOD=INTEN,LINE,,PIXEL 24m0008 MAPF[13] START-IN C800 $ 24m0008 ;VLDPIX 24m0008 MAPF[2] START-IN C800 $ 24m0008 ;VSYADR 24m0008 MAPF[1] START-IN POPJ C800 $ 24m0008 ;VSYDAT return (Note: Next instructon must have MAPF[7]) 24m0008 ];VIC2 24m0008 .REPEAT 1 - VIC2 [ 24m0008 VIDDT2: D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=0,,LINE 24m0008 D[CONST 4] ROT[6] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;AR=0,,LINE+256. 24m0008 D[AR] ROT[5] MASK[14.] DEST[Q] NORM $ 24m0008 ;Q=0 LINE 00000 24m0008 D[CONST 1] ROT[5] ALU[-D&Q] DEST[Q] NORM $ 24m0008 ;Q=0 LINE/2 000000 24m0008 D[AR] ROT[36. - 1] 24m0008 COND[-OBUS<0] JUMP[VIDDT3] C550 $ 24m0008 ;IF LSB[LINE]=1 24m0008 D[CONST 1] ROT[14.] ALU[QORD] DEST[Q] NORM $ 24m0008 ;Q=ODD[LINE] LINE/2 000000 24m0008 VIDDT3: ALU[Q] DEST[HOLD] NORM $ 24m0008 ;MEM=INTERLACED LINE 000000 24m0008 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 D[CONST 60.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 24m0008 ;MA=POGB+60. write INTERLACED LINE 000000 (temp) 24m0008 24m0008 MAPF[NORM-RD] D[CONST 5] ROT[6] ALU[D-1] DEST[Q] NORM $ 24m0008 ;Q=319. 24m0008 D[10 + PIXEL,,FRACT] ROT[18.] MASK[18.] ALU[Q+D] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 194 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 24m0008 ;Q=0,,PIXEL+319. 24m0008 D[10 + OFFSET,,LINE] ROT[18.] MASK[18.] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;Q=0,,PIXEL+0,,OFFSET+319. 24m0008 D[AR] MASK[18.] DEST[Q AR] NORM $ 24m0008 ;Q,AR=0,,PIXEL+OFFSET+319. 24m0008 D[AR] ROT[1] ALU[D+Q] DEST[AR] PUSHJ[VIDD33] NORM $ 24m0008 ;AR=3*corrected PIXEL divide by 33 24m0008 24m0008 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[AR] NORM $ 24m0008 ;AR=QUOTIENT,,REMAINDER=WORD,,PIXEL 24m0008 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 D[CONST 60.] ALU[Q+D] DEST[MA] NORM $ 24m0008 ;MA=POGB+60 read INTERLACED LINE 000000 24m0008 MAPF[NORM-RD] D[AR] ROT[18.] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=WORD 24m0008 D[MEM] ALU[QORD] DEST[Q] NORM $ 24m0008 ;Q=INTERLACED LINE 000000 + WORD (=interlaced address) 24m0008 24m0008 D[CONST 7] ROT[6] ALU[Q+D] DEST[Q] NORM $ 24m0008 ;Q=ADR+7*64. 24m0008 D[CONST 6] ALU[Q+D] DEST[IOD] START-OUT NORM $ 24m0008 ;IOD=ADR+7 lines, 6 words 24m0008 24m0008 MAPF[2] D[AR] MASK[18.] DEST[Q] C800 $ 24m0008 ;VLDADR Q=REMAINDER 24m0008 D[CONST 30.] ALU[D-Q] DEST[ROTR] NORM $ 24m0008 ;ROTR=30-REMAINDER 24m0008 D[10 + INTEN,,FRACT] DEST[Q] NORM $ 24m0008 ;Q=INTEN,,FRACT 24m0008 D[CONST 4] ROT[15.] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;AR=INTEN,,FRACT+0,,400000 24m0008 D[AR] ROT[18.] MASK[3] DEST[AR] NORM $ 24m0008 ;AR=0,,INTEN 24m0008 D[AR] ROT[R] DEST[AR] NORM $ 24m0008 ;AR=DATA correctly shifted 24m0008 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 D[CONST 59.] ALU[Q+D] DEST[MA] NORM $ 24m0008 ;MA=POGB+59. read COLOR MASK,,MASK 24m0008 MAPF[NORM-RD] D[AR] DEST[Q] NORM $ 24m0008 ;Q=DATA 24m0008 D[MEM] ROT[2] MASK[2] 24m0008 COND[-OBUS=0] PUSHJ[VIDCOL] C550 $ 24m0008 ;If bit(s) 0 or 1 of color on, "color" the word 24m0008 D[MEM] ALU[D#Q] DEST[IOD] START-OUT NORM $ 24m0008 ;IOD=DATA XOR COLOR 24m0008 MAPF[1] START-IN POPJ C800 $ 24m0008 ;VLDDAT (next line must have MAPF[7] ... C800) 24m0008 ];[ 24m0008 11657 640700070171000220000000 VIDDT2: D[10 + OFFSET,,LINE] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=0,,LINE 24m0008 11660 640710014435014040000000 D[CONST 4] ROT[6] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;AR=0,,LINE+256. 24m0008 11661 640700000171012160000000 D[AR] ROT[5] MASK[14.] DEST[Q] NORM $ 24m0008 ;Q=0 LINE 00000 24m0008 11662 640700014275012010000000 D[CONST 1] ROT[5] ALU[-D&Q] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 195 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 24m0008 ;Q=0 LINE/2 000000 24m0008 D[AR] ROT[36. - 1] 24m0008 11663 531140000571106440000000 COND[-OBUS<0] JUMP[VIDDT3] C550 $ 24m0008 ;IF LSB[LINE]=1 24m0008 11664 640700014175034010000000 D[CONST 1] ROT[14.] ALU[QORD] DEST[Q] NORM $ 24m0008 ;Q=ODD[LINE] LINE/2 000000 24m0008 11665 640704400555000440000000 VIDDT3: ALU[Q] DEST[HOLD] NORM $ 24m0008 ;MEM=INTERLACED LINE 000000 24m0008 11666 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 11667 640724014435000740000000 D[CONST 60.] ALU[Q+D] DEST[MA] STRT-WRT NORM $ 24m0008 ;MA=POGB+60. write INTERLACED LINE 000000 (temp) 24m0008 24m0008 11670 640700014131014050020000 MAPF[NORM-RD] D[CONST 5] ROT[6] ALU[D-1] DEST[Q] NORM $ 24m0008 ;Q=319. 24m0008 11671 640700040035044220000000 D[10 + PIXEL,,FRACT] ROT[18.] MASK[18.] ALU[Q+D] DEST[Q] NORM $ 24m0008 ;Q=0,,PIXEL+319. 24m0008 11672 640710070435044220000000 D[10 + OFFSET,,LINE] ROT[18.] MASK[18.] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;Q=0,,PIXEL+0,,OFFSET+319. 24m0008 11673 640710000171000220000000 D[AR] MASK[18.] DEST[Q AR] NORM $ 24m0008 ;Q,AR=0,,PIXEL+OFFSET+319. 24m0008 11674 640050000435002440001226 D[AR] ROT[1] ALU[D+Q] DEST[AR] PUSHJ[VIDD33] NORM $ 24m0008 ;AR=3*corrected PIXEL divide by 33 24m0008 24m0008 11675 640710004575044000200000 D[MEM] ROT[18.] SPEC[LEFT] ALU[DORQ] DEST[AR] NORM $ 24m0008 ;AR=QUOTIENT,,REMAINDER=WORD,,PIXEL 24m0008 11676 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 11677 640720014435000740000000 D[CONST 60.] ALU[Q+D] DEST[MA] NORM $ 24m0008 ;MA=POGB+60 read INTERLACED LINE 000000 24m0008 11700 640700000171044220020000 MAPF[NORM-RD] D[AR] ROT[18.] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=WORD 24m0008 11701 640700004175000440000000 D[MEM] ALU[QORD] DEST[Q] NORM $ 24m0008 ;Q=INTERLACED LINE 000000 + WORD (=interlaced address) 24m0008 24m0008 11702 640700014035014070000000 D[CONST 7] ROT[6] ALU[Q+D] DEST[Q] NORM $ 24m0008 ;Q=ADR+7*64. 24m0008 11703 640702214435000063600000 D[CONST 6] ALU[Q+D] DEST[IOD] START-OUT NORM $ 24m0008 ;IOD=ADR+7 lines, 6 words 24m0008 24m0008 11704 240700000171000220020000 MAPF[2] D[AR] MASK[18.] DEST[Q] C800 $ 24m0008 ;VLDADR Q=REMAINDER 24m0008 11705 640701214537000360000000 D[CONST 30.] ALU[D-Q] DEST[ROTR] NORM $ 24m0008 ;ROTR=30-REMAINDER 24m0008 11706 640700044171000440000000 D[10 + INTEN,,FRACT] DEST[Q] NORM $ 24m0008 ;Q=INTEN,,FRACT 24m0008 11707 640710014435036040000000 D[CONST 4] ROT[15.] ALU[Q+D] DEST[AR] NORM $ 24m0008 ;AR=INTEN,,FRACT+0,,400000 24m0008 11710 640710000571044030000000 D[AR] ROT[18.] MASK[3] DEST[AR] NORM $ 24m0008 ;AR=0,,INTEN 24m0008 11711 640710000571200440000000 D[AR] ROT[R] DEST[AR] NORM $ 24m0008 ;AR=DATA correctly shifted 24m0008 11712 640700074171000220000000 D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 24m0008 ;Q=POGB 24m0008 11713 640720014435000730000000 D[CONST 59.] ALU[Q+D] DEST[MA] NORM $ 24m0008 ;MA=POGB+59. read COLOR MASK,,MASK 24m0008 11714 640700000171000440020000 MAPF[NORM-RD] D[AR] DEST[Q] NORM $ ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 196 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 24m0008 ;Q=DATA 24m0008 D[MEM] ROT[2] MASK[2] 24m0008 11715 530040004571004020001247 COND[-OBUS=0] PUSHJ[VIDCOL] C550 $ 24m0008 ;If bit(s) 0 or 1 of color on, "color" the word 24m0008 11716 640702204735000443600000 D[MEM] ALU[D#Q] DEST[IOD] START-OUT NORM $ 24m0008 ;IOD=DATA XOR COLOR 24m0008 11717 240300000571000443410000 MAPF[1] START-IN POPJ C800 $ 24m0008 ;VLDDAT (next line must have MAPF[7] ... C800) 24m0008 ]1-VIC2 24m0008 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 197 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 25m0008 ;Compute Limits 25m0008 11720 640700074171000220000000 VIDVLM: D[10 + POG,,POGB] MASK[18.] DEST[Q] NORM $ 25m0008 ;Q=POGB 25m0008 11721 640700074035044040000000 D[10 + POG,,POGB] ROT[18.] MASK[4] ALU[Q+D] DEST[Q] NORM $ 25m0008 ;Q=POGB+POG 25m0008 11722 640720014435000200000000 D[CONST 16.] ALU[Q+D] DEST[MA] NORM $ 25m0008 ;MA=POGB+16.+POG read POG XMAX,,XMIN 25m0008 25m0008 11723 640700050171044000220000 MAPF[NORM-RD] D[10 + XMAX,,XMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=XMIN,,0 25m0008 D[MEM] ROT[18.] SPEC[LEFT] ALU[Q-D] 25m0008 11724 471140004477044000200000 COND[-OBUS<0] JUMP[VIDVL1] C600 $ 25m0008 ;If XMIN,,0-POGXMIN,,0<0 25m0008 11725 640700050171000000200000 D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=XMAX,,0 25m0008 11726 640700404575000223000000 D[MEM] MASK[18.] ALU[DORQ] DEST[XMAX,,XMIN] DEST-A-MEM NORM $ 25m0008 ;XMAX,,XMIN=XMAX,,POGXMIN 25m0008 25m0008 11727 640700050171000000200000 VIDVL1: D[10 + XMAX,,XMIN] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=XMAX,,0 25m0008 D[MEM] SPEC[LEFT] ALU[D-Q] 25m0008 11730 471140004537000000200000 COND[-OBUS<0] JUMP[VIDVL2] C600 $ 25m0008 ;If POGXMAX,,0-XMAX,,0<0 25m0008 11731 640700050171000220000000 D[10 + XMAX,,XMIN] MASK[18.] DEST[Q] NORM $ 25m0008 ;Q=0,,XMIN 25m0008 11732 640700004175000000200000 D[MEM] SPEC[LEFT] ALU[DORQ] DEST[Q] NORM $ 25m0008 ;Q=POGXMAX,,XMIN 25m0008 11733 640700400555000443000000 ALU[Q] DEST[XMAX,,XMIN] DEST-A-MEM NORM $ 25m0008 ;XMAX,,XMIN=POGXMAX,,XMIN 25m0008 25m0008 11734 640700024171000440000000 VIDVL2: D[MA] DEST[Q] NORM $ 25m0008 ;Q=MA 25m0008 11735 640720014435000200000000 D[CONST 16.] ALU[Q+D] DEST[MA] NORM $ 25m0008 ;MA=MA+16. read POG YMAX,,YMIN 25m0008 25m0008 11736 640700054171044000220000 MAPF[NORM-RD] D[10 + YMAX,,YMIN] ROT[18.] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=YMIN,,0 25m0008 D[MEM] ROT[18.] SPEC[LEFT] ALU[Q-D] 25m0008 11737 471140004477044000200000 COND[-OBUS<0] JUMP[VIDVL3] C600 $ 25m0008 ;If YMIN,,0-POGYMIN,,0<0 25m0008 11740 640700054171000000200000 D[10 + YMAX,,YMIN] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=YMAX,,0 25m0008 11741 640700604575000223000000 D[MEM] MASK[18.] ALU[DORQ] DEST[YMAX,,YMIN] DEST-A-MEM NORM $ 25m0008 ;YMAX,,YMIN=YMAX,,POGYMIN 25m0008 25m0008 11742 640700054171000000200000 VIDVL3: D[10 + YMAX,,YMIN] SPEC[LEFT] DEST[Q] NORM $ 25m0008 ;Q=YMAX,,0 25m0008 D[MEM] SPEC[LEFT] ALU[D-Q] 25m0008 11743 471300004537000000200000 COND[-OBUS<0] POPJ C600 $ 25m0008 ;If POGYMAX,,0-YMAX,,0<0 25m0008 11744 640700054171000220000000 D[10 + YMAX,,YMIN] MASK[18.] DEST[Q] NORM $ 25m0008 ;Q=0,,YMIN 25m0008 11745 640700004175000000200000 D[MEM] SPEC[LEFT] ALU[DORQ] DEST[Q] NORM $ 25m0008 ;Q=POGYMAX,,YMIN 25m0008 11746 640300600555000443000000 ALU[Q] DEST[YMAX,,YMIN] DEST-A-MEM POPJ NORM $ 25m0008 ;YMAX,,YMIN=POGYMAX,,YMIN 25m0008 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 198 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 26m0008 ;Multiply 26m0008 ;A3DYDX,,FRACT=MULTIPLICAND(2 BIT,,16 BIT 00) positive only 26m0008 ;Q=MULTIPLIER(0,,00 16 BIT) positive only 26m0008 11747 640710064571036440000000 VIDMUL: D[10 + A3DYDX,,FRACT] ROT[15.] DEST[AR] NORM $ 26m0008 ;AR=MULTIPLICAND(0 17 BIT,,1 BIT 00000000000000000) 26m0008 11750 640704401215000440000000 ACSEL[AC] ALU[0] DEST[O_AC HOLD] NORM $ 26m0008 ;HOLD=AC for safe keeping AC=0 26m0008 ;AR=MULTIPLICAND(0 17 BIT,,1 BIT 00000000000000000) 26m0008 ;Q=MULTIPLIER(0,,00 16 BIT) 26m0008 ;MEM=AC storage 26m0008 11751 640740014571000170000000 D[CONST 15.] LLOAD NORM $ 26m0008 ;Loop 16 times 26m0008 11752 640240002021000030001752 D[AR] ACSEL[AC] ALU[MULAC+D] DEST[D4] MASK[3] LOOP[.] NORM $ 26m0008 ;Add AR to AC depending on the low order bit of Q. 26m0008 ;Shift AC,,Q right. High order bit of AC=OVR XOR -IOB<0 26m0008 ;AC=PRODUCT(0 17 BIT,,18 BIT) 26m0008 11753 640710005171000440000000 D[MEM] ACSEL[AC] DEST[O_AC AR] NORM $ 26m0008 ;AC=AC storage, AR=PRODUCT(0 17 BIT,,18 BIT) 26m0008 11754 640300000171052240000000 D[AR] ROT[36. - 15.] MASK[20.] DEST[Q] POPJ NORM $ 26m0008 ;Q=PRODUCT(2 BIT,,18 BIT) return 26m0008 ;Q=PRODUCT(2 BIT,,18 BIT) 26m0008 ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 199 SLOE Jan ***, 1859 00:00:03 file DSK:VID.SLO -- of -- f2x 27m0008 ;Divide 27m0008 ;AR=DIVIDEND,,0 27m0008 ;MEM=DIVISOR,,0 27m0008 11755 531140000571000440000000 VIDDIV: D[AR] COND[-OBUS<0] JUMP[VIDDV1] C550 $ 27m0008 ;If AR<0 27m0008 11756 640710000473000440000000 D[AR] ALU[0-D] DEST[AR] NORM $ 27m0008 ;ABS[AR] 27m0008 11757 640710001171044440000000 VIDDV1: D[AR] ROT[18.] ACSEL[AC] DEST[O_AC AR] NORM $ 27m0008 ;AR LSH -18. <-> AC 27m0008 11760 640700000215000440000000 ALU[0] DEST[Q] NORM $ 27m0008 ;Q=0 27m0008 11761 531140004571000440000000 D[MEM] COND[-OBUS<0] JUMP[VIDDV2] C550 $ 27m0008 ;If MEM<0 27m0008 11762 640144404473000440000000 D[MEM] ALU[0-D] DEST[HOLD] JUMP[VIDDV2] NORM $ 27m0008 ;ABS[MEM] 27m0008 27m0008 : (. + 3) - (. \ 4) 27m0008 ;.QUAD-1 27m0008 11763 640740014571000440000000 VIDDV2: D[CONST 36.] LLOAD NORM $ 27m0008 ;Loop 37 times 27m0008 27m0008 VIDDVL: D[MEM] ALU[DIVAC-D] ACSEL[AC] DEST[D6] MASK[3] 27m0008 11764 451640007043000030001764 COND[OBUS<0] SLOOP[VIDDVL] C600 $ 27m0008 ;Loop here if remainder positive 27m0008 11765 640310001171000440000000 D[AR] ACSEL[AC] ALU[D] DEST[O_AC AR] POPJ NORM $ 27m0008 ;Swap AR <-> AC and return 27m0008 D[MEM] ALU[DIVAC+D] ACSEL[AC] DEST[D6] MASK[3] 27m0008 11766 451640007001000030001764 COND[OBUS<0] SLOOP[VIDDVL] C600 $ 27m0008 ;Loop here if remainder positive 27m0008 11767 640310001171000440000000 D[AR] ACSEL[AC] DEST[O_AC AR] POPJ NORM $ 27m0008 ;Swap AR <-> AC and return 27m0008 ;Q=QUOTIENT,,FRACT 27m0008 27m0008 .REPEAT XUCODE [ 27m0008 .USE[OTHER] ;If 8K u-mem present, return to low memory. 27m0008 ] 27m0008 [ 27m0008 .USE[OTHER] [ XLIST 27m0008 LIST ];If 8K u-mem present, return to low memory. 27m0008 ] ^L ; F2X.LST;13 Mon 5-Jan-81 11:28AM Page 200 SLOE Jan ***, 1859 00:00:03 file STRING: -- of -- f2x 39m0155 ]VID 39m0155 .OPCODE[766] 39m0155 [XLIST 39m0156 LIST ].REPEAT ((1 - VID) * (773 - 766 + 1)) [ 39m0156 ILGIOT $ ;OPS 766:773 39m0156 NOP $ 39m0156 ];1-VID 39m0156 .REPEAT VID [ 39m0156 ILGIOT $ ;OP 766 = illegal (reserved) 39m0156 NOP $ 39m0156 GETADR[VIDDPA] JUMP[GOHIGH]$ ;OP 767 = DPYADD 39m0156 ;Note: GETADR expands to 2 words 39m0156 FIXM2$ ;OP 770 = VIDIN 39m0156 D[CONST 36] DEST[DEV-ADR] JUMP[VIDIN]$ 39m0156 FIXM1$ ;OP 771 = VIDOUT 39m0156 D[CONST 36] DEST[DEV-ADR] JUMP[VIDOUT]$ 39m0156 GETADR[VIDDPI] JUMP[GOHIGH]$ ;OP 772 = DPYINI 39m0156 ;Note: GETADR expands to 2 words 39m0156 GETADR[VIDDPO] JUMP[GOHIGH]$ ;OP 773 = DPYOUT 39m0156 ;Note: GETADR expands to 2 words 39m0156 ];[ 39m0156 ILGIOT 39m0156 03754 000140000571000440002026 [ JUMP [MAIN] ]$ ;OP 766 = illegal (reserved) 39m0156 03755 000700000571000440000000 NOP $ 39m0156 GETADR[VIDDPA] [ ;Place the 12-bit value of VIDDPA in Q. 39m0156 03756 640700014171014040000000 D[CONST (77 & (VIDDPA / 100))] ROT[6] DEST[Q] NORM $ ;High-order 6 bits 39m0156 03757 440140014175000540006225 D[CONST (VIDDPA \ 100)] ALU[DORQ] DEST[Q] C600 ]JUMP[GOHIGH]$ ;OP 767 = DPYADD 39m0156 39m0156 ;Note: GETADR expands to 2 words 39m0156 03760 640706200550400440030000 FIXM2$ ;OP 770 = VIDIN 39m0156 03761 000141614571000360006246 D[CONST 36] DEST[DEV-ADR] JUMP[VIDIN]$ 39m0156 03762 640706000550400440020000 FIXM1$ ;OP 771 = VIDOUT 39m0156 03763 000141614571000360006251 D[CONST 36] DEST[DEV-ADR] JUMP[VIDOUT]$ 39m0156 GETADR[VIDDPI] [ ;Place the 12-bit value of VIDDPI in Q. 39m0156 03764 640700014171014030000000 D[CONST (77 & (VIDDPI / 100))] ROT[6] DEST[Q] NORM $ ;High-order 6 bits 39m0156 03765 440140014175000530006225 D[CONST (VIDDPI \ 100)] ALU[DORQ] DEST[Q] C600 ]JUMP[GOHIGH]$ ;OP 772 = DPYINI 39m0156 39m0156 ;Note: GETADR expands to 2 words 39m0156 GETADR[VIDDPO] [ ;Place the 12-bit value of VIDDPO in Q. 39m0156 03766 640700014171014040000000 D[CONST (77 & (VIDDPO / 100))] ROT[6] DEST[Q] NORM $ ;High-order 6 bits 39m0156 03767 440140014175000560006225 D[CONST (VIDDPO \ 100)] ALU[DORQ] DEST[Q] C600 ]JUMP[GOHIGH]$ ;OP 773 = DPYOUT 39m0156 39m0156 ;Note: GETADR expands to 2 words 39m0156 ]VID 39m0156 .RELOC 39m0156 [.USE[OTHER] 39m0156 [ XLIST 39m0157 LIST ]] 39m0157 ^L